스크린좌표라 하면 으레 윈도우즈 시스템의 좌표형태(우측이 +x, 아래측이 +y)라고 생각한다.
opengl에서 NDC -> screen space로 변환할 때, 당연히 y-negation을 해서 오른손 좌표계가 되는 줄 알았다. 어차피 뷰포트 변환이야 레스터라이저가 알아서 하고, glViewport만 호출하고 끝내니 지금까지 이처럼 알고 잘 쓰고있었는데,, 고맙게도 어느분께서 이 부분에 대해 이상한 현상이 발생한다고 질문해주신 덕분에 정확히 알게되었다.
OpenGL의 스크린공간은 y-up 왼손좌표계이다.
+y
│ +z
│ /
│ /
│/
└─────>+x
opengl의 텍스쳐좌표계와 통일성을 주려 한것일까.. 아무튼 이러하다.
때문에 프래그먼트셰이더상에서 뷰포트 역변환을 해야한다면
[math!]\begin{aligned} x_{ndc} &= \frac{2}{vp.width}( x_{scr} - vp.x) - 1\\ y_{ndc} &= \frac{2}{vp.height}(y_{scr} - vp.y) - 1 \\ z_{ndc} &= \frac{2}{(vp.zfar - vp.znear)}(z_{scr} - vp.znear) - 1\end{aligned}[/math!]
가 된다. 그런데 마우스 이벤트를 통해 들어오는 스크린좌표는 윈도우즈 스크린좌표계를 따라 아래방향이 +y축이라 오브젝트 피킹 등 어플리케이션 상에서 수행하는 뷰포트역변환은 오른손좌표계의 스크린공간이라 생각하고 계산해야한다.
'Graphics Note' 카테고리의 다른 글
implementing GJK in 3D (0) | 2014.05.24 |
---|---|
enabled, but unused vertex attribute array (0) | 2014.05.11 |
converting rotation quaternion into matrix, and vice versa (0) | 2014.04.21 |
rigid body collision 2 (0) | 2014.04.21 |
rigid body collision 1 (0) | 2014.04.21 |