Houdini

컴퓨터 그래픽스 강의 필기

Tedd_Kim 2022. 4. 24. 21:31

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 : 정수범위마다 마주보는 텍스쳐를 반복함