본문 바로가기
3D웹 프로그래밍/opengl

OPENGL 클리핑 및 뷰포트 변환

by 디찌s 2020. 11. 25.
728x90
반응형

클리핑

 

버텍스들이 버텍스 쉐이더를 떠날 때 그 위치는 클립 공간에 있다고한다.

 

이것은 위치를 나타내주는 좌표계중 하나이다.

 

버텍스,테셀레이션,지오메트리 쉐이더 등에서 gl_Position 변수를 저장할 때는 vec4 타입으로 4요소 벡터로 저장한다.

 

이 좌표는 동차 좌표라고 부른다.

 

hipdizzy.tistory.com/50

 

3D에서 사용하는 동차 좌표계란 무엇인가?

투영변환이란 무엇일까? 실세계의 한점 Q =(X,Y,Z)는 3차원의 점이다. 이점이 투영 스크린 상의 한점 (X,Y)로 즉 2차원점으로 변환되는 관계를 투영 변환이라한다. 이렇게 투영변환을 사용할 때는 동

hipdizzy.tistory.com

 

 

동차좌표계는 투영된 지오메트리에 사용되는데, 많은 수학 계산이 일반적인 카테시안 공간보다 더 단순해진다.

 

동차좌표는 카테시안 좌표보다 요소 하나가 더필요하기에 3차원 공간위치벡터는 4요소 변수로 표현된다.

 

비록 프론트엔드의 출력이 4요소 동차 좌표라하더라도, 클리핑은 카테시안 공간에서 수행되므로, 동차 좌표에서 카테시

 

안 좌표로 변환하기 위해 OpenGL은 원근 나눗셈을 수행한다.

 

이 의미는 그위치의 4요소를 마지막 요소인 w로 나누는 작업을 말한다.

 

(x,y,z,w)

 

w를 1.0으로 놓으면 동차 공간의 버텍스를 카테시안 공간으로 투영하는 효과가 있다. 대두분 gl_position의 w요소를 1.0

 

으로 설정한다 즉, 나눗셈 효과가없다 

 

원근 나눗셈이후, 결과 위치는 이제 정규화된 디바이스 공간에 있게된다. opengl에서는 정규화된 디바이스 공간의 보이

 

는 영역은 x와 y차원에서는 -1.0에서 1.0까지, z 차원에서는 0.0에서 1.0까지의 볼륨 영역이다. 이 영역에 포함된 지오메트리가 사용자에게 보이며, 이 영역밖은 무시된다.

 

다음 스테이지로 프리미티브들을 보내기 전에, Opengl은 각 프리미티브의 버텍스들이 이러한 평면들 중에 어떤 면에 놓여 있는지 판단하여 클리핑을 수행한다. 각 평면은 '바깥쪽'과 '안쪽'을 가진다.

 

만약 프리미티브의 모든 버텍스가 어떤 한 평면의 '바깥쪽'에 놓여 있다면 모두 버려진다.

 

 

뷰포트 변환

 

 

클리핑 후 지오메트리의 모든 버텍스는 x와 y차원에 대해 -1.0과 1.0 사이의 좌표를 갖게 된다. z좌표는 0.0과 1.0사이의 값을 갖는다. 이것이 바로 정규화된 디바이스 좌표다.

 

하지만 그릴 대상 윈도우는 좌하단이 (0,0)이고, 영역이 (w-1,h-1)인 좌표를 갖는다. 이때 w와  h는 각각 윈도우의 픽셀 단위 넓이와 높이다. 지오메트리를 윈도우 속으로 넣기 위해 OpenGL은 뷰포트 변환을 적용한다. 이변환은 스케일과 오프셋을 적용하여 버텍스들을 정규화된 디바이스 좌표에서 윈도우 좌표로 이동시킨다. opengl에서는

 

glviewport() 와 glDepthRange()를 호출하여 설장한다.

728x90
반응형

댓글