[DX] 정점 접공간

김진우·2025년 7월 28일

DirectX

목록 보기
31/32
post-thumbnail

정의

메시의 각 정점에서 정의되는 직교 좌표계로, 법선 맵을 이용한 조명에서 부드러운 표면 효과를 얻기 위해 사용된다.
이를 위해 삼각형별로 계산된 접공간 벡터들을 정점 기준으로 평균 내어 정점별 접공간을 만들며, 이 과정은 정점 법선을 평균 내어 부드러운 표면을 흉내 내는 방식과 유사하다.

즉, 메시의 정점 v에 대해, v를 공유하는 메시의 모든 삼각형의 접벡터들의 평균을 구해 정점의 접벡터 T를 결정하고, 종법선 벡터도 평균을 구해 정점의 종법선 벡터 B를 구한다.

1. 접공간과 물체 공간 사이의 좌표계 관계

메시의 각 정점에는 정규직교 기저인 TBN(Tangent, Bitangent, Normal) 벡터가 정의되어 있으며, 이로부터 접공간 좌표계가 만들어진다.
즉, 접공간에서 물체 공간으로 변환하는 행렬은 다음과 같다

Mobject=[TxTyTzBxByBzNxNyNz]M_{object} = \begin{bmatrix} T_x & T_y & T_z \\ B_x & B_y & B_z \\ N_x & N_y & N_z \end{bmatrix}

이 행렬은 접공간 좌표를 물체 공간 좌표로 변환한다.


2. 물체 공간 → 접공간 변환

위 행렬은 정직교행렬이므로 전치 행렬이 곧 역행렬이다.
따라서 물체 공간에서 접공간으로의 변환 행렬

Mtangent=Mobject1=MobjectT=[TxBxNxTyByNyTzBzNz]M_{tangent} = M_{object}^{-1} = M_{object}^T = \begin{bmatrix} T_x & B_x & N_x \\ T_y & B_y & N_y \\ T_z & B_z & N_z \end{bmatrix}

3. 접공간 → 세계 공간 변환 (쉐이더에서 조명 계산 시 필요)

쉐이더에서는 조명 계산을 위해 법선 벡터를 세계 공간 기준으로 변환해야 한다.
이를 위해 접공간 → 물체 공간 변환 후, 물체 공간 → 세계 공간 변환 행렬 MworldM_{world}를 곱한다.

nworld=(ntangentMobject)Mworld\vec{n}_{world} = (\vec{n}_{tangent} \cdot M_{object}) \cdot M_{world}

혹은 행렬 결합을 이용해 한 번에

nworld=ntangent(MobjectMworld)\vec{n}_{world} = \vec{n}_{tangent} \cdot (M_{object} \cdot M_{world})

4. TBN 행렬을 직접 세계 공간 기준으로 만들기

아예 접공간을 세계 공간 기준으로 직접 표현할 수도 있습니다. 즉, T, B, N 벡터를 세계 공간으로 직접 변환해놓는다.

이때는 다음처럼 계산된다.

Mobjectworld=[TxTyTzBxByBzNxNyNz]=[TMworldBMworldNMworld]M_{object \to world} = \begin{bmatrix} T'_x & T'_y & T'_z \\ B'_x & B'_y & B'_z \\ N'_x & N'_y & N'_z \end{bmatrix} = \begin{bmatrix} T \cdot M_{world} \\ B \cdot M_{world} \\ N \cdot M_{world} \end{bmatrix}

이렇게 하면 접공간 기준 벡터들을 곧바로 세계 공간 좌표계로 변환하여 사용 가능하다.

0개의 댓글