Clip Space
각 vertex shader 실행의 마지막에 OpenGL은 지정된 범위의 좌표를 받아들이고,
이 범위에서 벗어난 모든 좌표는clipped(자르다)된다.
clip된 좌표들은 폐기되고 남은 좌표들은 최종적으로 fragment가 되어 화면에 보이게 된다.
clip space에서 이름을 가져오는 위치이기도 하다.
눈에 보이는 모든 좌표들이 -1.0와 1.0 범위 안으로 지정하는 것은 직관적이지 않기 때문에
우리만의 좌표를 지정하고 작업을 수행한 후 그들을 다시 OpenGL이 원하는 NDC로 변환한다.
vertex 좌표를 view에서 clip-space로 변환하기 위해
우리는 좌표의 범위를 지정(예를들어 각 축에 대해 -1000에서 1000까지)하는 project matrix라고 불리는 것을 정의한다. 그런 다음 projection 행렬은 이 지정된 범위에 잇는 좌표들을 NDC(-1.0, 1.0)로 변환한다.
지정된 범위 밖에 있는 좌표들은 -1.0 ~ 1.0에 매핑되지 않으므로 clip된다.
projection 행렬에서 지정한 이 범위를 사용한다면 좌표 (1250, 500, 750)은 보이지 않게된다.
x 좌표가 범위밖에 있어 NDC에서 1.0보다 높아지므로 clip되기 때문이다.
projection 행렬이 생성하는 viewing box는 절두체(frustum)라고 불리고
이 절두체 내부에 있는 각 좌표들은 유저의 화면에 나타나게된다.
지정된 범위에서 NDC(2D view-space 좌표로 쉽게 매핑가능함)로 변환하는 전체적인 과정은
projection(투영)이라고도 불린다.
projection 행렬이 3D 좌표를 2D에 매핑하기 쉬운 NDC로 투영하기 때문이다.
모든 vertex들이 clip space로 변환되었다면 perspective division이라고 불리는 마지막 작업이 수행된다.
여기에서 위치 벡터의 x, y, z 요소들을 벡터의 w 요소로 나누어진다.
perspective division은 4D clip space 좌표를 3D NDC로 변환하는 것이다.
이 단계는 vertex shader의 실행 마지막에 자동으로 수행된다.
이 단계 이후에는 결과 좌표들을 screen 좌표에 매핑하고 fragment로 변환하는 것이다.
projection 행렬은 view 좌표를 clip 좌표로 변환하기 위해 두개의 다른 형식을 받는다.
각 형식은 자신만의 고유한 절도체를 가진다.
우리는 정사영(orthographic) projection 행렬과 원근(perspective) projection 행렬 중에서 하나를 생성할 수 있게된다.
'Programming > Soft Renderer_2019' 카테고리의 다른 글
#15 왼손 좌표계, 오른손 좌표계 (0) | 2019.12.16 |
---|---|
#14 정수만 사용해 선 빠르게 그리기 (0) | 2019.12.16 |
#11 투영 행렬 유도하기 (1) | 2019.12.16 |
#10 삼각형 내부 외부 판별 (0) | 2019.12.16 |
#9 백페이스 컬링 (0) | 2019.12.16 |