백페이스 컬링 과정과 외적 공식에 대해 정리하고, 이를 구현한 결과를 첨부하시오.
백페이스 컬링(BackFace Culling)
- 렌더링 시 최적화 방법 중 하나로 카메라에 보이지 않는 뒷면의 폴리곤을 제거하는 기법입니다.
컬링 과정
1. 꼭짓점에서 두 벡터를 가져온다.
$edge1 = vertices[1] - vertices[0]$
$edge2 = vertices[2] - vertices[0]$
2. 교차 하는 지점의 법선 벡터를 구한 뒤 정규화 합니다.
$faceNormal = edge \cdot edge2$
3. 내적을 통해 법선 벡터 및 카메라의 방향을 구합니다.
$faceNormal.Dot(CamForward)$
벡터의 외적과 내적
- 외적과 내적의 가장 큰 차이점은 외적은 벡터이고, 내적은 스칼라입니다.
$a = (a_1, a_2, a_3), \space b = (b_1, b_2, b_3)$
외적
- $a \cdot b = (a_2 b_3 - a_3 b_2, a_3 b_1 - a_1 b_3, a_1 b_2 - a_2 b_1)$
내적
- $a \cdot b = a_1 b_1 + a_2 b_2 + a_3 b_3$
구현 코드
Vector3 edge1 = vertices[indices[bi + 1]] - vertices[indices[bi]];
Vector3 edge2 = vertices[indices[bi + 2]] - vertices[indices[bi]];
Vector3 faceNormal = edge1.Cross(edge2).Normalize();
static Vector3 cameraDir = -Vector3::UnitZ;
if (cameraDir.Dot(faceNormal) > 0.f)
{
continue;
}
결과
수업에서 제시한 각 단계별 과정을 정리하고 최종 결과물을 첨부하시오
- 초점거리 = 투영할 화면 및 카메라 거리 설정을 위한 것.
- 초점거리를 구하려면 NDC의 Y/2크기를 1로 정규화 시켜주면 아래 $tan$ 공식을 통해 초점거리(d)를 구할 수 있다.
$\tan(\frac{\theta}{2}) = \frac{1}{d}$
- Pview에 맞춘 초점거리(-Zview)를 만든다.
- 그 후 Xndc를 구한다.
$d:-z_{view} = y_{ndc}:y_{view}$
$y_{ndc}=\frac{d\cdot y_{view}}{-z_{view}}$
$x_{ndc}=\frac{\frac{d}{a}\cdot x_{view}}{-z_{view}}\space (a = \frac{width}{height})$
- x와 y의 좌표값을 구했으니 행렬식으로 변환한다.
$\begin{bmatrix}
a & b & c & d \\
e & f & g & h \\
i & j & k & l \\
m & n & o & p
\end{bmatrix} \cdotp
\begin{bmatrix}
x_{view} \\
y_{view} \\
z_{view} \\
1
\end{bmatrix} \space = \space
\begin{bmatrix}
x^{\prime} \\
y^{\prime} \\
z^{\prime} \\
w^{\prime}
\end{bmatrix} \space = \space
\begin{bmatrix}
\frac{x^{\prime}}{w^{\prime}} \\
\frac{y^{\prime}}{w^{\prime}} \\
\frac{z^{\prime}}{w^{\prime}} \\
1
\end{bmatrix} \space = \space
\begin{bmatrix}
x_{ndc} \\
y_{ndc} \\
z_{ndc} \\
1
\end{bmatrix}$
- $x^{\prime}$와 $y^{\prime}$는 서로 직교하고 있으므로 전부 0으로 채워줍니다.
$\begin{bmatrix}
\frac{\frac{d}{a}}{-z_{view}} & 0 & 0 & 0 \\
0 & \frac{d}{-z_{view}} & 0 & 0 \\
i & j & k & l \\
m & n & o & p
\end{bmatrix} \cdotp
\begin{bmatrix}
x_{view}\\
y_{view}\\
z_{view}\\
1
\end{bmatrix}=
\begin{bmatrix}
\frac{d}{a} \cdotp {x_{view}}\\
\frac{d\cdotp y_{view}}{-z_{view}} \\
z^{\prime} \\
w^{\prime}
\end{bmatrix}$
- $w^{\prime}$을 $-z_{view}$로 바꾼 뒤 $x,y,z$에 나눠줍니다.
$\begin{bmatrix}
\frac{d}{a} & 0 & 0 & 0 \\
0 & d & 0 & 0 \\
i & j & k & l \\
0 & 0 & -1 & 0
\end{bmatrix} \cdotp
\begin{bmatrix}
x_{view}\\
y_{view}\\
z_{view}\\
1
\end{bmatrix}=
\begin{bmatrix}
\frac{d}{a} \cdotp {x_{view}}\\
d\cdotp y_{view} \\
z^{\prime} \\
-z_{view}
\end{bmatrix}$
- 마찬가지로 영향을 미치지 않는 값들을 0으로 바꿔줍니다.
$\begin{bmatrix}
\frac{d}{a} & 0 & 0 & 0 \\
0 & d & 0 & 0 \\
0 & 0 & k & l \\
0 & 0 & -1 & 0
\end{bmatrix} \cdotp
\begin{bmatrix}
x_{view}\\
y_{view}\\
z_{view}\\
1
\end{bmatrix}=
\begin{bmatrix}
\frac{d}{a} \cdotp {x_{view}}\\
d\cdotp y_{view} \\
z^{\prime} \\
-z_{view}
\end{bmatrix}$
$k, l$을 사용해 $z$의 값이 $-near$ 이면 $z/w = -1$이며
$z$의 값이 $-far$ 이면 $z/w = 1$ 입니다.
$\begin{bmatrix}
\frac{d}{a} & 0 & 0 & 0 \\
0 & d & 0 & 0 \\
0 & 0 & k & l \\
0 & 0 & -1 & 0
\end{bmatrix} \cdotp
\begin{bmatrix}
0\\
0\\
-n\\
1
\end{bmatrix}=
\begin{bmatrix}
0 \\
0 \\
-n \\
n
\end{bmatrix}$
$-k \cdotp n + l = -n$
$\begin{bmatrix}
\frac{d}{a} & 0 & 0 & 0 \\
0 & d & 0 & 0 \\
0 & 0 & k & l \\
0 & 0 & -1 & 0
\end{bmatrix} \cdotp
\begin{bmatrix}
0\\
0\\
-f\\
1
\end{bmatrix}=
\begin{bmatrix}
0 \\
0 \\
f \\
f
\end{bmatrix}$
$-k \cdotp f + l = f $
- 여기서 $k, l$은 모르지만 -n이 나오기 위해선 대입으로 식이 풀어집니다.
- 또한, -n이랑 f가 서로 부호가 다른 이유는 깊이 값이 -1~1이기 때문입니다.
$k = \frac{n +f}{n -f}, \space l = \frac{2nf}{n -f}$
- 위 값을 행렬에 대입하면 다음과 같이 나옵니다.
$Project = \begin{bmatrix}
\frac{d}{a} & 0 & 0 & 0 \\
0 & d & 0 & 0 \\
0 & 0 & \frac{n+f}{n-f} & \frac{2nf}{n -f }\\
0 & 0 & -1 & 0
\end{bmatrix}$
- $VTRS$를 $PVTRS$로 바꿔줍니다.
- Clip Coordinate에서 $w_c$를 이용해 정규화를 진행함.
$(\frac{x_c}{w_c}, \frac{y_c}{w_c}, \frac{z_c}{w_c}, 1)$
- 종횡비에 맞춰 늘려줍니다.
$screen = (x_ndc * width * 0.5f, yndc * height * 0.5f)$
결과
'게임제작기법연구' 카테고리의 다른 글
게임제작기법 연구 14주차 (0) | 2020.07.14 |
---|---|
게임제작기법연구 13주차 (0) | 2020.07.07 |
게임제작기법연구 11주차 (0) | 2020.06.22 |
게임제작기법연구 10주차 (0) | 2020.06.16 |
게임제작기법연구 8주차 (0) | 2020.06.02 |