1. 프라미드 정점 목록, 색인 목록
색인 (vo v3 v1) (v1, v3, v2) (v3 v4 v0)(v0 v4 v1)(v1 v4 v2) (v2 v3 v4)
정정 목록 : v0 {0,0,0} v1 {1, 0, 0} v2{1, 0,1} v3{0,0,1} v4 {0.5,1,0.5}
2. 두 도형의 정점 색인을 하나로 표현
정점 목록
a 형태 정점 목록 : v0 {0,0,0} v1{0.2, 1, 0} v2{1.2, 1, 0} v3{0.8, 0.2, 0}
b 형태 정점 목록 : v4{5, 0.5, 0} v5{6,0.5,0}, v6{5.8, 0.25,0} v7{5,0,0}
v8{4.8,0.25,0} v9{4,0.5,0} v10{4.8, 0.75,0} v11{5,1,0} v12{5.8, 0.75,0}
색인 목록
(v0 v1 v2) , (v0 v2 v3)
(v4 v5 v6) (v4, v6, v7) (v4, v7, v8) (v4, v8, v9) (v4, v9, v10) (v4, v10, v11)
(v4, v11, v12)
3. 카메라가 세계 좌표계 기준으로 (-20,35,-50), 대상점 (10,0,30)
셰계공간 상향 벡터(0,1,0) 카메라이 시야 행렬 값은
//연습문제 3
pos = XMVectorSet(-20, 35, -50, 1.0f);
target = XMVectorSet(10.0f, 0.0f, 30.0f, 0.0f);
up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMMATRIX view = XMMatrixLookAtLH(pos, target, up);
4. 수직 시야각 45도, 종횡비 a = 4/3 , 가까운 평면 n =1, 먼거리 100
P = XMMatrixPerspectiveFovLH(0.25f * MathHelper::Pi, 4/3, 1.0f, 100.0f);
5. 시야 창 높이 4, 수직 시야각 60도 시야창과 원점의 거리 d의 값은 ?
$$ tan30 = \frac{2}{d}\\d = 2cot(30)\\d=3.464 $$
6. 다음 원근 투영 행렬에서 수직 시야각 a, 종횡비 r, 가까운 평면 n 먼 평면 f 를 구해라
$$ \begin{bmatrix}1.866.3 & 0 & 0 & 0 \\0 & 3.73205 & 0 & 0 \\0 & 0 & 1.02564 & 1 \\0 & 0 & -5.12821 & 0 \\\end{bmatrix} $$
자세한 계산 7번 참고
$$ a = 2arctan(1/3.73205) = 30\\r = 3.73205/1.86603 = 1.999\\f = 1.02564n / 1.02564 -1 = 40.0015n\\n = -\frac{-5.12821}{1.02564} = 5\\f = 40.0015 * 5 = 200 $$
7.다음과 상수 A, B,C, D 원근 투영 행렬에서
수직 시야각 a, 종횡비 r, 가까운 평면 n 먼 평면 f를 구현 하는 식을 풀어라
$\begin{bmatrix}A & 0 & 0 & 0 \\0 & B & 0 & 0 \\0 & 0 & C & 1 \\0 & 0 & D & 0 \\\end{bmatrix}$
A,B, C D의 식을 풀면 a, r, n, f 를 추출 하는 공식이 나타 난다.
$$ A = \frac{1}{rtan(a/2)}\\B = \frac{1}{tan(a/2)}\\C = \frac{f}{f-n}\\D = \frac{-nf}{f-n} $$
B값을 풀어서 a 값을 구한다
$$ B = \frac{1}{tan(a/2)}\\\frac{1}{B} = tan(a/2)\\arctan(\frac{1}{B}) = arctan(tan(a/2))\\arctan(\frac{1}{B}) = a/2\\2 arctan(\frac{1}{B}) = a $$
arctan(tan(a/2)) = a/2 속성을 이용해서 풀이
A 값 풀이 위에서 a 값을 사용
$$ A = \frac{1}{rtan(a/2)}\\\frac{1}{A} = rtan(a/2)\\a = 2arctan\frac{1}{B}\\\frac{1}{A} = rtan(\frac{2arctan\frac{1}{B}}{2})\\\frac{1}{A} = r * \frac{1}{B}\\\frac{B}{A} = r $$
tan(arctan(1/B)) = 1/B 속성을 이용해서 풀이
C 식에서 f 식을 추출
$$ C = \frac{f}{f-n}\\ C(f-n)-f = 0\\ Cf-Cn-f = 0\\ Cf - f = Cn\\ (C -1)f = Cn\\ f = \frac{Cn}{C-1} $$
D값 구하기
위의 f 식을 넣어줘서 n을 구한 후 f를 구한다.
$$ f = \frac{Cn}{C-1} \ \ D = \frac{-nf}{f-n}\\D(f-n) = -nf \\D(\frac{Cn}{C-1} - n) = -n \frac{Cn}{C-1}\\CnD - nD(C-1) = -Cn^2\\CnD - CnD + nD = -Cn^2\\nD = -Cn^2 \\-\frac{D}{C} = n $$
8. 다음 식을 증명 하라 VPTw == VPwT 즉 원근 나누기 전 후에 아핀 행렬을 곱 할 경우
값이 같은지 증명 해라 V = 4차원 벡터, P = 투영 행렬, w = 원근 나누기, T = 아핀 행렬
T 아핀 변환은 w 값에 영향을 주지 않는다
$$ (\frac{vP}{(vP)_w})T = \frac{(vPT)}{(vPT)_w} $$
//연습 문제 8 테스트
XMVECTOR V = XMVectorSet(1.0f, 1.0f, 2.0f, 0.0f);
V = XMVector4Transform(V, P);
XMFLOAT4 wvalue;
XMStoreFloat4(&wvalue, V);
wvalue.x = wvalue.x/wvalue.w;//원근 나누기
wvalue.y = wvalue.y / wvalue.w;
wvalue.z = wvalue.z / wvalue.w;
wvalue.w = wvalue.w / wvalue.w;
// Define a 4x4 matrix
XMMATRIX m = XMMatrixIdentity();
// Set the matrix to translate by (1, 2, 3)
m.r[3] = XMVectorSet(1.0f, 2.0f, 3.0f, 1.0f);
V = XMLoadFloat4(&wvalue);
V = XMVector4Transform(V, m);
XMStoreFloat4(&wvalue, V);
XMVECTOR V2 = XMVectorSet(1.0f, 1.0f, 1.0f, 0.0f);
V2 = XMVector4Transform(V2, P * m);
XMFLOAT4 wvalue2;
XMStoreFloat4(&wvalue2, V2);
wvalue2.x = wvalue2.x / wvalue2.w;//원근 나누기
wvalue2.y = wvalue2.y / wvalue2.w;
wvalue2.z = wvalue2.z / wvalue2.w;
wvalue2.w = wvalue2.w / wvalue2.w;
참고 및 내용 인용
프랭크 D 루나 지음, 류광 옮김
한빛 미디어
Directx 12를 이용한 3D 게임 프로그래밍 입문(2017)
'Directx12 3D 프로그래밍 입문 > 5. 렌더링 파이프 라인' 카테고리의 다른 글
5.11 렌더링 파이프 라인 요약 (1) | 2024.02.08 |
---|---|
5.10 래스터화, 뷰포트, 후면 선별 (0) | 2024.02.08 |
5.7 테셀레이션, 기하 셰이더, 절단 (0) | 2024.02.08 |
5.1 렌더링 파이프 라인의 개요 (1) | 2023.11.13 |
5. 렌더링 파이프 라인 (1) | 2023.11.12 |