에디의 우당탕탕 코딩공장

[DirectX11] Texture Normal(Bump) Mapping

by 인턴 에디

📌 텍스쳐 노멀 맵핑(범프 맵핑) 개요

      - 폴리곤의 법선 벡터(Normal Vector)의 값을 사용하여 로우 폴리곤의 그래픽 환경에서 하이 폴리곤의 입체감 및 질감을 구현하는 방법.

      - 물체의 질감을 있는 그대로 폴리곤으로 표현하면 삼각형의 양이 많아지고 결국 연산이 많이 필요하게 되는데 폴리곤을 적게 사용하고도 비슷한 효과를 낼 수 있는 기술이다.

 

✔ 기존에는 diffuse연산을 할 경우, 각 폴리곤의 법선 벡터로만 라이팅 연산을 하기 때문에 폴리곤 안의 픽셀들은 같은 라이팅 연산을 하게 된다.(폴리곤 단위). 폴리곤 단위로 라이팅 연산이 아닌 픽셀 단위로 라이팅 연산이 되기 때문에 고퀄리티 처럼 보이게 된다.

diffuse texture
normal texture

normal map을 사용하여 각 픽셀에서의 빛의 방향을 계산하여 diffuse texture에 적용시키면 아래와 같은 울퉁불퉁한 느김의 텍스쳐를 얻게 된다.

많은 폴리곤들을 사용하는 것보다 비용이 훨씬 적게 든다.

 

📌 노멀 맵의 원리

     - 노멀 맵을 만들기 위해서는 이미 만들어진 3D 모델을 노멀 맵으로 바꾸어 주는 틀을 사용한다.

 

       1.  각 폴리곤에 접선공간(Tangent Sapce)라는 3D 공간을 만든다.

           - 각 폴리곤(Vertex)들이 갖고 있는 법선벡터를 Z축(N)으로 삼고, UV좌표 중 하나를 법선(Tangent)로 한다.

        그리고, 두 축 N,T를 외적해서 종법선(Binormal)을 구한다.( 외적은 PS에서 수행해야한다.)

       2.  버텍스 셰이더에서 T,B,N 값에 WorldMatrix를 곱해준다.

       3.  float3x3 TBN = float3x3(T, B, N); // 법선맵에서 가져온 벡터를 접선공간에서의 법선벡터로 사용하게할 변환행렬.

if(hasNormalMap)
{
    float4 normalMapping = normalMap.Sample(samp, input.uv); // 법선맵 RGB값 가져오기.
    float3x3 TBN = float3x3(T, B, N); // 법선맵에서 가져온 벡터를 접선공간으로의 법선벡터로 매핑할 변환행렬.
    normal = normalMapping * 2.0f - 1.0f; // 법선맵의 RGB값(0~1)을 벡터단위(-1~1)로 변환.
    normal = normalize(mul(normal, TBN)); // 접선공간의 법선벡터로 변환.
}

✨ Reference = https://maxlevel-trace.tistory.com/20?category=805944

블로그의 정보

에디의 우당탕탕 코딩 공장

인턴 에디

활동하기