[GPG 4 글 5.3] DX에서의 빛싱크와 월드지형에 대해서...

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

DX에서의 빛싱크와 월드지형에 대해서...

Post by 비회원 »

일단 책은 GL기준이구요.
1. 빛싱크 부분에 대해서요..
투영공간에서의 광원의 w값이 0보다 작으면 빛싱크라고 적혀있는데
DX에서는 0보다 큰 경우가 빛싱크가 맞죠?
일단 기본적으로 빛 싱크라는 것은.. 카메라의 뷰벡터와의 내적결과가 +인 경우.. 빛 싱크가 일어나는 것같습니다. GL하고 DX둘다 여기까지는 부호가 같지만, GL의 투영행렬의 43과 DX의 투영행렬의 34의 값이 서로 다르죠. 각각 -1과 +1입니다. 이 값들이 카메라공간의 z값과 곱해져서 +, -부호를 가지게 되는 것인데..
만약 광원벡터가 카메라의 뷰벡터와의 내적결과가 +라면.. 그럼 투영공간에서의 w값이 GL은 -이고 DX는 +가 맞는얘기죠?

2. 투영공간에서의 광원의 좌표중 y값이 -로 넘어가는 경우 문제입니다..
월드지형이 있고.. 지형이 y=0을 기준으로 +방향으로 솟아있고.. 캐릭터가 그 위를 뛰어다닐것이고..
캐릭터주위에 카메라가 있을것이고.. 지면위를 비출 것입니다. 이 상태서 광원이 어떤 방향으로 비추게 될때. 광원을 투영공간으로 이동시키는데, 부호가 -로 되어버릴 때가 있습니다. 이 경우는.. 카메라가 지형밑으로 들어가게되서 상당히 골치가 아픈 상태로 되어버리네요. 이 경우 어떻게 해결할지 감이 안옵니다.
여러가지 방법을 써보긴했는데 맘에 안드는 결과만 나오네요.
tomatowax
Posts: 464
Joined: 2005-01-17 12:22
Contact:

빛과 관련해서..

Post by tomatowax »

제가 이해한 질문이 맞는지 모르겠는데요,

OpenGL 에서는 빛을 정의할 때 Position 값으로 Position 과 Direction 을 함께 정의해주는데요-

w 가 0 이라는 것은 Directional Light 를 적용받고 있음을 의미하고
0 이 아니라는 것은 (보통 1) Point Light 나 Cone 형태의 Light 를 의미합니다.

Direct3D 에서는 Ligth 를 정의해줄 때 Position 과 Direction 을 각각 변수로 정의해주므로
해당 내용과는 무관합니다.

사실 질문에서 광원의 w 값이라고만 해주셔서 정확히 어떤 '변수' 의 w 값을 의미하는지 알 수 없으나, 일반적으로 OpenGL 에서 광원의 w 값에 따라 빛의 속성을 정의해준다.. 라는 내용으로는 제가 이해한 내용이 맞을 것 같습니다.

2번 질문은 다음 분께 Toss..
비회원

Re: 빛과 관련해서..

Post by 비회원 »

TomatoWAX wrote:제가 이해한 질문이 맞는지 모르겠는데요,

OpenGL 에서는 빛을 정의할 때 Position 값으로 Position 과 Direction 을 함께 정의해주는데요-

w 가 0 이라는 것은 Directional Light 를 적용받고 있음을 의미하고
0 이 아니라는 것은 (보통 1) Point Light 나 Cone 형태의 Light 를 의미합니다.

Direct3D 에서는 Ligth 를 정의해줄 때 Position 과 Direction 을 각각 변수로 정의해주므로
해당 내용과는 무관합니다.

사실 질문에서 광원의 w 값이라고만 해주셔서 정확히 어떤 '변수' 의 w 값을 의미하는지 알 수 없으나, 일반적으로 OpenGL 에서 광원의 w 값에 따라 빛의 속성을 정의해준다.. 라는 내용으로는 제가 이해한 내용이 맞을 것 같습니다.

2번 질문은 다음 분께 Toss..
답변 감사드립니다.
하지만 제가 원하는 답은 아니네요^^; 질문 내용은 그 부분이 아니구요.
현재 광원은 방향성 광원이 맞습니다. w가 0이구요.
방향성 광원은 POST PROJECTION SPACE에서 점광원이 됩니다.(Z위치가 무한평면상에 위치하고요)
여기서 GL에서는 w값이 0보다 작은 경우에 빛싱크가 발생한다고 책에 씌여있습니다.
즉, 월드에서의 광원의 방향이 시점의 뒤쪽에서 비추고 있는 상태를 의미하는데요.
POST PROJECTION SPACE의 w값을 결정짓는것은, 카메라 공간에서의 z값을 의미합니다.
여기서, 광원이 시점의 뒤쪽에서 비추고 있다는 것은 광원의 방향과 카메라의 뷰벡터의 방향과 일치한다는 것이고 따라서 내적결과가 양수가 나오게 됩니다. 그리고.. 프로젝션행렬의 3행 4열부분에서 GL의 경우-1이고
DX의 경우는 +1입니다. 그래서 뒤쪽에서 비추고 있을때 POST PROJECTION SPACE에서..
GL의 경우 -1이 나오게 되고 DX의 경우 +1이 나온단 얘기였습니다.
그래서 전 DX의 경우 책에 나온것과 정반대로 해야하는거 맞죠? 라고 문의한것이구요.
비회원

Re: 빛과 관련해서..

Post by 비회원 »

비회원 wrote:답변 감사드립니다.
...그리고.. 프로젝션행렬의 3행 4열부분에서 GL의 경우-1이고
DX의 경우는 +1입니다. 그래서 뒤쪽에서 비추고 있을때 POST PROJECTION SPACE에서..
GL의 경우 -1이 나오게 되고 DX의 경우 +1이 나온단 얘기였습니다.
...
그런데 의문점이 드는 점은.. NVIDIA의 PSM 샘플이 DX를 씀에도 불구하고..
w값이 음수일때 INVERTED된다는 점입니다.. 그래서 이런 질문을 했던거구요..
비회원

Re: 빛과 관련해서..

Post by 비회원 »

비회원 wrote: 그런데 의문점이 드는 점은.. NVIDIA의 PSM 샘플이 DX를 씀에도 불구하고..
w값이 음수일때 INVERTED된다는 점입니다.. 그래서 이런 질문을 했던거구요..
view space에서 perspective matrix로 넘어 오면서 w의 효과가 발휘됩니다.

위치정보일 경우 (x,y,z,1) * perspective matrix를 하면 (x', y', z', z) 되고 이것을 다시
(x'/z, y'/z, z'/z, z/z)를 해서 post-perspective space로 넘어 오게 되는데. 여기서 z/z를 해줘야 되는 부분이 w를 1로 바꿔주는 부분입니다. z/z를 해주기전에 (x', y', z', z) 이부분에서 z값이 w가 되는데 w값을 가지고 뷰 시점의 뒤에 있는지 앞에 있는지 확인이 가능합니다.

왼손 좌표계로 설명하자면
w값 ((x', y', z', z)의 4번째 z의 값)이 0 < w, 0 > w, 0 == w일때 3가지 조건이 생깁니다.

0 == w
무한대평면(infinity plane)에 도달한다고 표현하는데 z/z하기전의 (x', y', z' ,z) 일때는 앞이 좁은 사다리 꼴 모양으로 앞쪽이 좁은 모양이라 0에 가까워 질수록 좁아 지고 0에 수렴되되는 ◁ 이런 모양이고,z/z를 해주면서 ◁ -> □ 을 만들어 주면서 ▷ 모양이되면서 앞부분이 커지면서 perspective하게 표현됩니다. 분모가 0 이므로 계산할수 없는 상황이 생기네요.

0 < w 일때는 카메라 시점에 있다는 뜻이고 0 > w 일때는 카메라 시점 뒤에 있다는 뜻으로 생각하시면 됩니다.
거기에 맞게 처리를 해주시면 됩니다. ^-^)" 그래서 음수 일때 INVERTED해주는거죠.

-----------------------------------------------------------------------------------------
[email protected]
melodyz
Posts: 5
Joined: 2005-04-08 14:41

Re: 빛과 관련해서..

Post by melodyz »

비회원 wrote: 그런데 의문점이 드는 점은.. NVIDIA의 PSM 샘플이 DX를 씀에도 불구하고..
w값이 음수일때 INVERTED된다는 점입니다.. 그래서 이런 질문을 했던거구요.
읔 이제 휴먼 계정 풀고 로그인 했습니다. 비회원으로 하면 수정안되는 줄모르고 그냥 두서 없이 적어서 낭패났네요. ㅎ

NVIDIA의 PracticalPSM의 샘플보니까 왼손좌표계를 사용했더군요.

오른손 좌표계에서 뷰 스패이스는 z축(at vector)이 -값(+z축의 반대)이에요. 그래서 projection matrix를 곱하면서 NDC용 unit cube가 될때 z값을 다시 +값(0~1)으로 바꿔 줘야 되기 때문에 dx의 D3DXMatrixPerspectiveRH의 계산식에 _34 값이 -1이되서 w값이 -z값이 됩니다. 반면 왼손 좌표계에서는 뷰 스패이스 z축이 +값이라 NDC로 갈때 그냥 w값은 z값이 됩니다. D3DXMatrixPerspectiveLH의 _34값은 1이죠.

그래서 RH, LH상관없이 w값이 음수일때는 무한평면에 있는 빛 싱크가 된다고 생각하시면 됩니다.

글제주가 없어서..., DX Help 문서에서

D3DXMatrixLookAtLH, ,D3DXMatrixPerspectiveLH,
D3DXMatrixLookAtRH, D3DXMatrixPerspectiveRH

식 찾으셔서 찬찬히 비교해보세요.
Post Reply