기존의 텍스처 매핑 방법은 정점 자료에 법선 정보를 넣어 삼각형 내에서 3개 정점에 대한 법선을 보간하는 방법으로 법선을 지정했는데, 법선 매핑을 사용하면 더 세밀하게 법선을 지정할 수 있다고 한다.

법선을 높은 해상도(더 세밀한 방법)에서 지정하면 조명의 세부도가 높아지지만, 메시 기하구조 자체의 세부도까지 높아지지는 않는다.

 

법선 맵을 만드는 도구

1. NVIDIA의 Photoshop용 법선 맵 필터

2. CrazyBump

19.2 법선 맵

법선 맵은 하나의 텍스처이다. RGB 를 8비트씩 24비트에 저장하는 텍스처라고 가정하면 RGB에 x y z (법선 벡터) 를 넣는다. 대체로 법선 벡터는 z축과 유사한 방향이기 때문에 z 값이 x y 값보다 높아 법선 맵 텍스처를 색상 이미지로 보게 되면 푸르스름한 모습이 된다. 

 

법선 맵을 압축 텍스처 형식에 저장하고 싶다면 BC7(DXGI_FORMAT_BC7_UNORM) (압축된 텍스처는 렌더링 파이프라인의 셰이더 단계에 대한 입력으로만 사용할 수 있다.)을 사용하는 것이 최상의 품질을 보인다.

 

BC7로 압축된 텍스처맵 gNormalMap을 변환하는 과정

float normalT = gNormalMap.Sample( gTriLinearSam, pin.Tex ); // [0, 255] -> [0, 1]

normalT = 2.0f * normalT - 1.0f // [0, 1] -> [-1, 1] 

 

19.3 텍스처 공간 또는 접공간

ㄴ 삼각형이 있는 평면의 u, v를 기저로 만들어지는 공간

 

텍스처 왜곡이 없다고 가정 (이동과 회전만 있는 강체 변환)

조명 공식을 계산하려면 법선 벡터와 빛이 같은 공간에 있어야 하므로 

 

접벡터 T(tangent) : 텍스처 공간의 u벡터를 물체 공간 기준 벡터로 변환한 벡터

종법선 B(bitangent) : 텍스처 공간의 v벡터 물체 공간 기준 벡터로 변환한 벡터

법선 벡터 N(normal) : T와 B의 외적

 

삼각형의 3개 정점의 u, v 좌표와 물체 공간 기준 좌표( posL )를 사용하여 T벡터와 B벡터를 얻을 수 있다.

ㄴ 삼각형별 접공간을 유도할 수 있다. (= T, B, N을 구할 수 있다.)

 

19.4 정점 접공간

삼각형별 접공간을 사용하여 법선 매핑을 하면 삼각형 내부의 3개 점이 같은 법선을 사용하기 때문에 조명 계산이 삼각형 단위로 (삼각형 내부는 같은 색) 진행된다.

 

정점의 접공간을 계산하는 방법은 정점을 공유하는 메시의 모든 삼각형의 접벡터와 종법선의 평균을 사용하여 정점의 접벡터(T)와 종법선(B)을 구하는 것이다.

 

평균을 내서 구한 TBN 기저벡터는 이후 변환 계산을 위해 정규 직교화하여 정점 자료에 저장한다. 보통 그람-슈미트 정규직교화 방법을 사용한다.

 

19.6 법선 매핑 셰이더 코드

법선 맵의 법선 벡터(접공간)에 TBN 기저(세계 변환과 보간이 일어난 접벡터와 법선 벡터로 만든) 를 이용한 변환 행렬을 곱하여 Bumped normal을 얻는다. 이 법선은 이후 법선 벡터가 관여하는 모든 계산 (조명, 입방체 매핑)에 쓰인다.

 

정점 셰이더에서 법선 벡터와 접벡터에 대한 세계변환이 일어난다.

래스터화 단계에서 특성에 대한 보간이 일어난 뒤 픽셀 셰이더에 전달된다.

픽셀 셰이더에서는 법선 맵에서 추출한 표본을 픽셀 셰이더의 입력으로 받은 법선 벡터와 접벡터를 사용하여 세계 좌표계로 변환한다.

 

normal 맵의 알파 채널에는 픽셀 수준의 광택 계수가 들어 있다.

연습문제

2.

Crazubump 프로그램으로 생성한 normal map
예제 프로그램 타일에 텍스처를 적용한 모습

 

 

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/19

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

21. 주변광 차폐  (0) 2022.07.10
20. 그림자 매핑  (0) 2022.07.08
18. 입방체 매핑  (0) 2022.07.02
17. 3차원 물체의 선택  (0) 2022.07.01
16. 인스턴싱과 절두체 선별  (0) 2022.06.30

+ Recent posts