개요
기존에는 삼각형의 한 점의 법선을 정점 법선들의 보간으로 구했다. 이제는 법선 맵에서 텍스처 좌표로 법선을 추출하여 특정 픽셀의 법선을 구하는 법선 매핑을 사용해 볼 것이다.
법선 맵
법선 맵은 각 텍셀이 단위 벡터에 해당하는 텍스처이다. 보통 0~255의 8비트 RGB를 사용하며 이는 단위벡터의 각 원소의 상한인 -1 ~ 1을 0~255로 변환한 값에 해당한다. 보통 포토샵이나 기타 툴로 법선 맵을 작성하면 RGB에 각각 0~255값으로 변환된채 텍스처가 저장되는데 이러한 텍스처를 루트 매개변수에 넣고 표본 추출을 통해 특정 텍셀을 추출하면 자동으로 0~1의 값으로 변환된다. 여기에 2를 곱하고 1을 빼서 -1 ~ 1구간으로 변환하면 원래의 단위 벡터를 구할 수 있다.
텍스처 공간 (접 공간)
법선 맵의 각 법선들은 텍스처 공간 기준의 좌표로 기록된다. 텍스처 공간은 한 삼각형에서 각 정점이 텍스처 좌표를 가질 때 그 텍스처 좌표간의 변화량을 기준으로한 수평 기저 벡터인 T, B와 그에 수직인 N 기저 벡터로 구성되는 공간을 말한다. 따라서 각 텍스처를 가지는 각 삼각형 별로 텍스처 공간이 정의된다. 따라서 삼각형의 한 점에서 그 텍스처 좌표로 법선 맵으로 법선을 추출해내면 그 법선의 좌표는 그 점의 삼각형에서의 텍스처 공간에서의 좌표이다.
어떠한 점에서 텍스처 공간의 법선을 물체 공간기준 법선으로 변경하려면 삼각형의 세 정점으로 만들어지는 두 벡터의 물체 공간 좌표와 텍스처 좌표의 관계로 물체 공간 기준에서의 텍스처 공간 기저 벡터 T,B를 구하고 그에 대한 외적으로 N을 구하면 그 벡터들의 행렬로 텍스처 공간 -> 물체 공간 좌표 변경 행렬을 구할 수 있다.
정점 접공간
실제 셰이더에서 법선 매핑을 하는 방법은 다음과 같다.
1. 각 메시 정점에 해당 삼각형에서의 물체 공간 좌표 기준 접공간 기저벡터 세개를 저장한다.
2. 정점 셰이더에서 기저 벡터들에 월드행렬을 곱해 월드 공간 기준 기저벡터로 변환하여 출력한다.
3. 픽셀 셰이더에서 특정 픽셀의 보간된 월드 공간 기준 기저벡터를 받는다.
4. 해당 픽셀의 텍스처 좌표로 텍스처 공간 기준 법선 벡터를 추출하고 기저벡터들의 행렬로 월드좌표로 변환한다.
5. 해당 픽셀의 법선 벡터로 그 벡터를 사용하여 렌더링한다.
여기서 각 정점의 기저벡터들을 기록할 때 삼각형 별로 세개의 정점을 만들어 각 삼각형의 기저벡터를 그대로 넣는다면 각진 삼각형면들위에 법선 매핑이 될 것이고 기존 법선에 사용한 방법처럼 정점 별로 인접한 삼각형들의 기저벡터들의 평균을 넣어주면 보간에 의하여 각 픽셀별로 삼각형의 곡면을 따르는 텍스처 기저 벡터들로 렌더링 하게된다. 그렇게 하면 둥근 곡면을 기준으로 법선 매핑이 일어난다. 이는 각 픽셀별로 별개의 텍스처 공간을 가진 것으로 해석 할수도 있다.
추가로 각 삼각형별로 실제 텍스처 기저벡터를 모두 기록하여 사용 할 수도 있지만 간소화를 위해 법선벡터와 접벡터만을 기록하여 사용하기도 한다. 이경우 나머지 한 기저는 두 벡터의 외적으로 구한다. 이때 법선 벡터가 N 기저 벡터를, 접벡터가 T기저 벡터를 나타내며 삼각형에서 텍스처의 u좌표가 증가하는 방향으로 접벡터를, 면의 법선방향으로 법선 벡터를 지정해주면 텍스처 공간의 법선들이 해당 방향으로 정규 직교로써 적용되게 된다. 이렇게 되면 삼각형의 텍스처 좌표가 실제 텍스처 공간과 왜곡되더라도 텍스처 공간은 정규 직교가 되어 법선 맵의 법선 벡터가 회전되어 해당 법선, 접벡터 방향으로 적용되게 된다고 볼 수 있다. 이렇게 하면 메시를 생성할때 각정점의 법선 벡터와 텍스처 u좌표 증가방향으로 접벡터만 만들어주면 적절한 법선 매핑이 구현되게 된다.
알파 값
법선 맵에서는 RGB만 사용하기에 A값이 빈다. 여기서 A값에는 광택도 계수들의 추가적인 재질 정보등을 담는 식으로 활용하면 더 세부적인 재질 매핑이 가능하다.
변위 매핑
법선 맵외에 높이 맵이라는 기법도 존재한다. 높이 맵은 각 텍셀에 추가 높이가 기록되어 있는 텍스처이다. 높이 맵을 사용하는 기하구조는 테셀레이션을 사용하여 이를 구현한다. 사각형으로 예를 들면 사각형을 거리에 따라 적절하게 테셀레이션하여 격자로 만든다. 그리고 영역 셰이더에서 각 격자 정점의 텍스처 좌표로 높이 맵에서 추가 높이 값을 추출하고 그 값만큼 정점의 월드 좌표를 증가시키면 높이 맵이 적용된 메쉬가 만들어진다. 그 메쉬로 렌더링을 진행하게되면 높이 맵이 구현된다.
참고서적
DirectX 12를 이용한 3D 게임 프로그래밍 입문
'그래픽스 > DirectX12' 카테고리의 다른 글
[Directx12][21장]주변광 차폐 (0) | 2023.03.21 |
---|---|
[Directx12][20장]그림자 매핑 (0) | 2023.03.21 |
[Directx12][18장]입방체 매핑 (0) | 2023.03.21 |
[Directx12][17장]3차원 물체의 선택 (0) | 2023.03.21 |
[Directx12][16장][2]절두체 선별 (0) | 2023.03.21 |