Q : 카메라 위치; T : 카메라가 바라보는 지점; j : world space y축(상향벡터)
$w = \frac{T - Q}{||T-Q||}$
$u = \frac{j \times w}{||j \times w||}$
$v = w \times u$
view matrix 계산 함수
XMMatrixLookAtLH
XMMATRIX XM_CALLCONV XMMatrixLookAtLH( // 시야 행렬 v를 출력
FXMVECTOR EyePosition, // 입력 카메라 위치 Q
FXMVECTOR FoucusPosition, // 입력 대상 점 T
FXMVECTOR UpDirection, // 입력 세계 상향 벡터 j
)
5.6.3 투영과 동차 절단 공간
카메라에 보이는 공간은 절두체(frustum; 각뿔대) 로 정의 됨
3차원 장면을 2차원 이미지로 표현하려면, 절두체 안의 3차원 기하구조를 2차원 투영 창으로 투영(projection)
투영 방식은 반드시 하나의 소실점으로 수렴하는 방식, 깊이가 증가함에 따라 투영크기가 감소하는 방식
정점의 투영선(line of projection) :3차원 기하 구조의 한 정점에서 시점으로의 직선
5.6.3.1 절두체의 정의
절두체(Frustum) :
원근 투영에서 사용되는 두 개의 평행한 평면으로 잘린 피라미드 모양의 공간
투영 중심에서 양의 z 축을 바라보는 시야 절두체 4가지 수량
n : 원점과 가까운 평면 사이 거리 (z축 상 거리)
f : 먼 평면 사이의 거리 (z축 상 거리)
a : 수직 시야각
b : 수평 시야각
r : 종횡비 (w/h)(후면 버퍼 종횡비)
투영 창은 후면 버퍼에 사상되므로, 종횡비를 후면 버퍼의 종횡비와 일치시키는 것이 좋음
일치하지 않으면, "비균등 비례"를 적용 (이미지 왜곡됨)
$$ h=2 일 떄, r = \frac{w}{h} = \frac{w}{2} => w = 2r $$
$$ \tan{(\frac{\alpha}{2})} = \frac{1}{d} => d = \cot{(\frac{\alpha}{2})} $$
Y 각도가 커지면 절두체의 Y크기가 커지는데, 종횡비에 맞춰서 X 각도도 커지기에 종횡비는 변하지 않는다. → 절두체의 크기가 커졌기에, 물체는 작아져 보인다.
원근투영 행렬 구축 함수
// 투영 행렬 반환
XMMATRIX XM_CALLCONV XMMatrixPerspctiveFovLH(
float FovAngleY // 수직 시야각(라디안)
float Aspect, // 종회비 = 너비 / 높이
float NearZ, // 가까운 평면 거리
float FarZ // 먼 평면 거리
)
``` ```cpp
// 투영 행렬 반환
XMMATRIX XM_CALLCONV XMMatrixPerspctiveFovLH(
float FovAngleY // 수직 시야각(라디안)
float Aspect, // 종회비 = 너비 / 높이
float NearZ, // 가까운 평면 거리
float FarZ // 먼 평면 거리
)
5.7 테셀레이션 단계들
선택적 단계
테셀레이션(Tessellation) :
주어진 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정
새 삼각형을 새로운 위치로 이동 함으로써, 원래 메시에는 없는 세부적인 특징을 만들어 냄
장점
카메라에 가까운 삼각형들에는 테셀레이션을 적용해서 세부도 향상, 먼 삼각형에는 적용하지 않는 방식의 세부수준(level-of-detail, LOD) 메커니즘 구현 가능
메모리에는 저다각형(low-poly) 메시를 담고 즉석에서 메시를 추가함으로써 메모리 절약
애니메이션이나 물리 처리 같은 연산들은 low-poly에서 수행, 테셀레이션된 고다각형 메시는 렌더링에만 사용 (계산량 줄이기)
D3D11 부터 추가 된, 기하구조를 GPU에서 테셀레이션하는 수단 제공
5.8 기하 셰이더 단계
선택적 단계
기하 셰이더 단계(Geometry Shader) :
하나의 온전한 기본 도형을 입력받아서 임의로 변형
정점 셰이더의 처리를 거친 정점을 입력 받음
입력 받은 기본 도형을 바탕으로 새로운 도형 생성, 파괴
점이나 선분을 사각형으로 확장
기하 셰이더에서 출력된 정점 위치들은 반드시 동차 절단 공간으로 변환된 것이어야 함
장점
기하구조를 GPU에서 생성하거나 파괴 가능
스트림 출력 단계를 통해 메모리의 버퍼에 저장해 두고 나중에 활용 가능
5.9 절단
절단 (clipping) :
완전히 시야 절두체 바깥에 있는 기하구조는 폐기, 절두체의 경계면과 교차하는 기하구조는 절두체 내부의 것만 남도록 잘라내는 것
볼록 도형 절단 시, 볼록 도형이 남음
삼각형을 절단할 시, 사각형이 되므로 삼각화 연산 필요
하드웨어가 수행해 줌
서덜런드-호지먼 절단 알고리즘 참고
4차원 점 (x,y,z,w)가 시야 절두체 안에 있을려면 다음 조건 만족
-w <= x <= w; -w <= y <= w; 0 <= z <= w
왼쪽 평면 : w = -x; 오른쪽 평면 : w = x; 아래 평면 w = -y;
위 평면 : w = y; 가까운 평면 : z = 0; 먼 평면 : z = w;
5.10 래스터화 단계(resterization sate)
투영된 3차원 삼각형으로부터 픽셀 색상들을 계산
5.10.1 뷰포트 변환
절단 후, 하드웨어는 원근 나누기를 수행해서 동차 절단 공간 좌표를 장치 좌표(NDC)로 변환할 수 있음
정점들이 NDC 공간으로 들어오면, 2차원 이미지 형성 점들의 2차원 x,y 좌표성분들이 후면 버퍼의 한 직사각형 영역으로 변환 (뷰포트)
뷰포트 변환 시, z 성분 변하지 않음
선형 변환이기에 왜곡되지 않았다는 것이지 [0,1]구간으로 값 자체는 선형 매핑으로 변함
D3D12_VIEWPORT 구조체의 MinDepth, MaxDepth 변경으로 깊이 값에 영향 미칠 수 있음 <- 반드시 [0, 1] 구간
5.10.2 후면 선별
삼각형 정점들이 $v_0, v_1, v_2$ 순서로 감길 때, 삼각형의 법선 n은 다음과 같이 정의