게임제작기법연구

게임제작기법연구 12주차

ckhyeok 2020. 6. 29. 04:59

백페이스 컬링 과정과 외적 공식에 대해 정리하고, 이를 구현한 결과를 첨부하시오.

백페이스 컬링(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