컴퓨터 그래픽스 강의 필기
GLSL = GL Shading Language
좌표계(Coordinate System)
1. World Space
: 말 그대로 고정된 origin(0,0,0)을 기준으로 한 좌표계
2. Object Space
: 오브젝트의 피봇을 기준으로 한 좌표계
3. View(Camera) Space
: 카메라의 광학 방향(Z), 아랫방향, 오른쪽 방향을 기준으로 한 좌표계
Matnet에서 Global P는 월드 오리진 (0,0,0)을 기준삼는게 아니라 아니라 카메라 위치를 (0,0,0)으로 기준삼는다
4. Tangent Space
: 각 포인트 혹은 버텍스의 Normal, Tangent, Bitanget를 기준으로 한 좌표계 (uv)
벡터 계산을 할 때, 대상이 되는 두 벡터가 같은 Space상에 존재해야한다.
그래서 Space Transform을 하는 것
Vertex Shader 단계
[ World Transform ]
오브젝트 공간에서 월드 공간으로 이동하는 것
[ View Transform ]
월드 공간에서 카메라 공간으로 이동하는 것
Eye : 카메라의 위치
At : 카메라가 바라보고 있는 곳
Up : 카메라의 윗방향을 나타내는 벡터 (카메라가 틸팅이 되는 경우 위가 어딘지 알아야하기 때문에)
n = EYE - AT / ||EYE -AT|| (이번에만 적음, 분모는 정규화를 위한 벡터의 크기)
u = UP x n / ||UP x n|| (외적)
v = n x v (외적, 얘는 이미 길이가 1인 벡터를 외적한 것이기 때문에, 1x1정사각형의 넓이라고 표현할 수 있다. 따라서 크기가 1이고 그 자체로 단위벡터이기 때문에 정규화를 할 필요가 없음)
이렇게 되면 n,u,v가 서로 모두 수직이기 때문에 ortho(직교)-normal(단위벡터)하다고 표현할 수 있다.
따라서, 완벽한 좌표계이기 때문에 이것을 camera-space라고 한다. (월드스페이스가 x,y,z축인 것처럼)
[ Projection Transform ]
카메라 공간에서 클립 공간으로 변환하는 것
fovy (field of view along y-axis) = y축(사이드뷰)를 기준으로 얼만큼의 시야각을 가질 것인지
aspect = width/height, 종횡비 (16:9같은)
두 개의 파라미터를 통해서 피라미드가 형성되는데, 이 때 near-plane과 far-plane을 추가적으로 도입하여 view frustum(절두체)을 형성한다.
따라서, 4가지의 파라미터 (=fovy, aspect, n, f)를 통해서 frustum을 형성하고 이 범위를 벗어난 오브젝트들은 culling하여 처리하지 않는다. Frustum안에 있는 오브젝트들만 GPU렌더링 파이프라인으로 넘어감
하지만, Frustum에 포함된 오브젝트의 일부 폴리곤이 경계를 나간다면, 그것은 clipping하여 경계 안쪽의 폴리곤들만 처리함.
이 과정에서 절두체를 기반으로 clipping을 수행하는 건 어려움이 따르기 때문에, 절두체를 정육면체로 변환하는 과정을 거친다. 이것을 Projection Transform이라고 함
Rasterizer 단계
Clipping
Perspective division
Back-face culling
Viewport transform
Scan conversion
[Clipping]
Frustum에 걸친 삼각형 메쉬를 잘라내어 새로운 삼각형을 생성한 후 처리
[Perspective division]
원근법 나눗셈, 이를 시행하면 NDC(Normalized device coordinates)를 얻을 수 있다
[Back-face culling]
원리 : 카메라 스페이스를 기준으로 내적(dot product) 계산을 통해 음수가 나오는 back-face를 걸러내는 작업
하지만 지금 단계에선 이미 카메라 공간이 아니라 NDC공간에 있기 때문에(원근법이 적용되어 오브젝트에 변형이 있음) 다른 방식으로 계산하여 back-face를 걸러냄
하지만, 반투명한 물체는 culling을 시행하지 않음. 혹은 이미 front-face가 잘려나간 경우에도 시행하지 않음.
그렇기 때문에 clipping과는 달리 특정 조건을 만족해야 시행한다
ex. glEnable(GL_CULL_FACE) -> GL_BACK, GL_CW
[Viewport Transform]
클립 공간에서 스크린 공간으로 변환하는 것
(참고 : 현재까지 World, View, Projection, Viewport 변환 나왔음)
Clip space인 NDC가 scaling, translation을 통해 직육면체, 즉 Screen space로 변환되는 과정
[Scan conversion]
앞에 4단계를 통해서 오브젝트의 position데이터는 바뀌었지만 노말과 uv텍스쳐좌표는 바뀌지 않았음
이 단계에서 이중 선형 보간을 통해서 저 둘을 변환시킴
이렇게 보간된 것들을 fragment라고 함
Fragment Shader 단계
이 단계에서는 전단계에서 생성된 fragment(보간된 노말과 uv좌표)에 색상을 입히는 작업을 함
1. Lighting
2. Texturing 작업이 포함된다
[ Texturing ]
uv좌표가 0 ~ 1 의 범위를 벗어났을 때
a. Clamp to Edge : 가장자리의 색상으로 텍스쳐가 쭉 늘어짐
b. Repeat : 정수범위마다 텍스쳐가 반복됨 (예를 들어, 벽돌 텍스쳐 같은 경우)
c. Mirrored-Repeat : 정수범위마다 마주보는 텍스쳐를 반복함