2012-07-02 6 views
0

LWJGL 패키지를 사용하고 있으며 기본 장면을 만들고 모양을 사용하여 (텍스처 사용 여부와 관계없이) 사용자 지정 '카메라'개체를 이동하고 그에 따라 장면을 렌더링 할 수 있습니다. 그러나 그림자를 만드는 것에 관해서는, 나는 손실에 처해있다.OpenGL에서 장면의 그림자를 렌더링하는 가장 간단한 방법은 무엇입니까?

그림자를 만드는 기본적인 알고리즘을 생각해 볼 수 있습니다.
1) 그림자가있는 것처럼 카메라의 장면에서 장면을 렌더링하십시오.
2) 빛의 시야에서 장면을 렌더링하여 장면의 보이는 부분을 밝게합니다 (광원에서 멀어 질수록 장면이 어둡게 보일 수 있습니다).
3) 카메라의 장면에서 장면을 다시 렌더링합니다.

그러나 OpenGL (특히 LWJGL)의 특정 방법을 알지 못합니다. 이 주제에 대한 연구 결과, 필자는 지오 메트릭의 모든 점과 평면을 필요로하는 자습서를 보거나 자신의 프로젝트에서 작동하지 않는 부분 코드만을 포함하는 자습서를 발견했습니다.

나는 이것을 올바르게 생각하고 있습니까? 그렇다면 모델의 보이는 부분을 음영 처리 (또는 다른 작업)하기 위해 사용해야하는 메서드는 무엇입니까?

+0

가능한 [OpenGL 그림자 만들기] (0120-13753) – genpfault

+0

@genpfault 나는이 주제와 관련된 몇 가지 유사한 주제를 살펴 보았다. . 나는 그 수색 기간을 봤다, 그러나 그 방법의 단지 하나는 나가 언급 한 산법에 적용 가능하다. 나는 행렬 수학을 사용하여 그림자를 결정하려고 시도한 사람들 중 일부를 시도해 보았지만 결코 나를 위해 일한 사람은 없었습니다. 정확히 어떻게하는지 묻는 것이 아니라 알고리즘을 사용하는 메소드 호출입니다. 휴 (Hugh) 코드는 더 많이 또는 적게 사용했는데 정확하게 따라갈 수는 있지만 ... 알 수없는 몇 가지 이유 때문에 작동하지 않습니다. 하지만 중복에 대한 귀하의 우려를 이해합니다. –

답변

1

가장 간단한 방법은 빛의 관점에서 장면을 렌더링하는 것입니다. 깊이 맵의 내용을 그림자 맵 텍스처로 저장하십시오. 각 깊이는 광원에 가장 가깝습니다. 그런 다음 장면을 다시 렌더링하고 빛의 위치를 ​​기준으로 '세계'공간에서 각 조각 텍스처 좌표를 계산합니다. 값을 섀도우 맵과 비교하십시오 : 더 큰 경우이 부분은 음영 처리됩니다.

몇 년 전에 저는 이것을 보여주기 위해 오래된 (사전 셰이더) OpenGL 코드를 작성했습니다. GLUT에서는 C로되어 있지만, 모든 OpenGL 비트는 LWJGL 또는 JOGL에서 1 : 1 이에 상응합니다. http://cs.anu.edu.au/~hugh.fisher/3dstuff/shadows.tar

현대적인 셰이더로 상응하는 것을 번역해서는 안됩니다.

희망이 도움이됩니다.

+0

코드를 읽었을 때, 어떻게 읽었는지에 대한 논리적 인 의미가 있습니다. 그러나, [포트 코드] (http://pastebin.com/u3bjeRV5)에 대한 나의 시도는 그 배경을 넘기지 않습니다. 나는 내가 잘못한 것을 잃어 버렸다. 내 컨텍스트 (카메라 호출 및 light.lookThrough() 메서드 호출)에서 작동하도록 몇 가지를 변경하고 몇 가지 변수 및 내용을 변경해야했습니다. 버퍼는 내 BufferUtility 클래스를 통해 직접 할당됩니다. 렌더링은 간단한 drawPlanes() 및 camera.lookThrough()로 작동하지만 display() 버전으로 메서드를 대체해도 아무 것도 그려지지 않습니다. –

+0

사실, renderToShadowMap() 메서드의 끝에서 호출 된 GL11.glViewport 메서드까지 추적했습니다. 그러나 라인을 주석 처리하면 측면 렌더링 막대가 나타나지 않으며 장면이 렌더링되지 않습니다. 전체 장면이 그림자에있는 것처럼 보임). –

+0

그리고 또 다시 테스트하면 뷰포트 문제가 해결되어 (물론 몇 가지 다른 실수를 깨닫게됩니다) 장면은 여전히 ​​완전한 그림자 상태입니다 (심지어 enableShadowing() 메서드를 호출하지 않아도 iff renderToShadowMap() 메서드를 호출하지 않습니다.) 죄송합니다. –

0

구현하고 이해하려면 광선 추적 그림자라고 말합니다. 기본적으로지면에서 광선을 캐스팅하고 텍스처의 각 픽셀에 대해 아무 것도 안타는지 확인합니다. 그러나 그것은 미친 듯이 preformance를 죽인다. 그러고 싶다면 광선 계산을 한 번 해 텍스처에 저장 한 다음 레벨/바다의 시작 부분에로드하십시오. 이것은 역동적이지는 않지만 작동합니다.

관련 문제