-동차좌표계란?
3D에서는 기본적으로 3차원좌표계이지만 어떤 목적에 의해 4차원으로 확장할 수 있는데, 이것이 동차좌표계다. 기본적인 성분 x, y, z에 w가 추가된 것으로 3D상에서는 x/w, y/w, z/w로 나타낸다. 동차좌표계가 있음으로 오브젝트의 이동을 행렬간 곱셈으로 표현할 수도 있으며, 포인트(w=1)와 벡터(w=0)를 가늠할 수 있는 기준이 되기도 한다.
-동차좌표계와 투형행렬
투영행렬에서, 카메라공간상에 존재하는 점과 카메라 위치 사이의 깊이값(z)를 최종 결과점의 x, y, z에 각각 곱해지고, w에 저장되는데 바로 이 과정이 동차좌표계를 위한 과정이다. 해당 좌표공간(카메라공간, 투영공간, 월드공간 등등)에서의 3D좌표를 얻어내려면 w로 나눠내면 된다. 여기서 월드공간, 카메라공간에서는 w값이 항상 1이기 때문에 아무런 변화가 없지만, 투영공간에서는 w값이 카메라공간에서의 카메라의 위치에서부터 정점사이의 거리이기 때문에 z값에 따라 정점의 위치와 크기가 변환되는 것임을 짐작할 수 있다. 따라서, 셰이더에서 다른 공간은 별로 상관없지만, 투영공간상에 존재하는 좌표를 다룰 경우 동차좌표계상에 존재하기 때문에 w성분으로 나누어 줘야한다.
[푸의 요약]
라이푸의 큐티한 그림을 보자면-_- 별은 카메라, 파란선은 전방 후방 클립면, 검은색네모는 버텍스이다. 만약 우리가 삼각형을 그
리기위해서 버텍스를 입력하게되면 w=1 이다. 이것이 버텍스셰이더를 거치게되면서 w값이 변경된다. 정확히 말하면 프로젝션매트릭스를 거치기전까지 w=1을 유지한다. 프로젝션을 거치게되면(버텍스셰이더를거치게되면) 현재 카메라좌표와 버텍스간의 거리값이(깊이값) w에 저장하게 되고 x,y,z에도 곱해진다. 이런 역할을 하는 것이바로 동차좌표계이다. w=1이라는 규약은 전후방 클립면의 총거리를 1로 나타내는 것이다. 그렇다면 동차 좌표계를 실제로 사용되는 곳이 어딜까? 셀프셰도우 구현시 DepthMap을 렌더타겟에 그리게 되는데 이때 버텍스셰이더에서 mal(vPOS, mWVP) 정보를 픽셀셰이더에서 이를 vPos.xyz / vPos.w로 나누어 3D상에서 실제좌표를(Z깊이값) 얻어 낼때 사용된다. 더 정확하게 말하면 버텍스셰이더에서 Z값이 아닌 픽셀셰이더를 거쳐 선형보간된 Z값을 얻을 때 사용되는 것이다. 그리고 디퍼드 구현때도 G-Buufer에서 Original View Position을 픽셀셰이더에서 재건할때도 동일한 원리를 적용하여 vPos.xyz / vPos.w값을 사용하게 된다.
[References]
http://neosafe.blog.me/130044604300
http://ekessy.tistory.com/2
'Math' 카테고리의 다른 글
Math - 벡터 (Vector) (0) | 2017.04.20 |
---|---|
Math - 점과 점 사이의 각도 구하기 (0) | 2017.04.19 |
Math - 점과 점 사이의 거리 구하기 (0) | 2017.04.19 |
Math - Radian과 Degree (0) | 2016.05.19 |
Math - 정반사 벡터 (0) | 2016.03.07 |