[DX3D] Cube Mesh
법선, 접선, 종법선
- 법선(Normal) : 한 평면에 수직인 벡터
- 접선(Tangent) : 정점 표면의 정보
- 종법선(Bi-Normal) : 노말의 수직인 벡터 (접선과 법선의 외적)
정점
2D 에서는 인덱스 버퍼를 이용하여 정점 4개 만을 사용해 RectMesh를 생성했었다.
3D 에서는 표면에 수직인 법선 벡터를 알아야 빛의 세기를 계산할 수 있으므로 (램버트 코사인 법칙 참고)
기존에 정점이 가지고 있던 정보인 Pos, Color, UV 값에 법선 벡터 정보가 추가되어야 한다.
더 다양한 3D Light 연산을 위해 접선, 종법선 벡터도 같이 추가해 준다.
Rect Mesh
Rect Mesh 는 정점 6개로 Triangle Mesh 2개를 이어붙인 구조였다. 여기서 인덱스 버퍼를 활용하면 정점 수를 4개로 줄일 수 있었다.
정점 하나에 위치, 색깔, UV 정보만 있으므로 겹치는 구간(0번, 2번)이 있어도 인덱스 버퍼를 활용할 수 있었다.
Cube Mesh
Cube Mesh를 구현하려면 앞에서 말했듯이 정점에 노말, 탄젠트, 바이노말 정보도 포함이 되어야 한다. 기존의 RectMesh에서는 접선이 겹쳐도 상관이 없었던 반면에, Cube Mesh 에서는 정점 하나에 세 면의 정보가 겹치게 되는데, 이 때 각 면을 기준으로 노말이 다르게 된다.
그림으로 예를 들면 빨간색 정점에는 앞면(초록), 윗면(노랑), 옆면(파랑) 의 노말이 각 색깔 방향으로 되어있다.
그러므로 각 면당 인덱스 버퍼를 활용하여 4개의 정점이 필요하므로 Cube Mesh를 만들기 위해서는 4x6=24 개의 정점이 필요하다.
각 면의 정점 정보들을 채우려면 위의 Cubemap Texture 정보를 참고하여 보면 좀 더 편하게 생각할 수 있다.
왼쪽 그림처럼 Cube Mesh가 만들어지기 때문에 각 면의 좌표를 기준으로 UV 값과 노말, 탄젠트, 바이노말을 구하면 된다.