Normal Mapping

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 Normal Mapping

ezgif com-crop (2)

Texture Tangent Frame
1 normal
  • 원래 normal이라 함은 tangent plane에 수직해야 함
  • normal mapping이란 메시의 vertex는 그대로 두고, normal만 수정해 입체 효과를 내는 기법
  • 위 gif는 평면 메시에 normal mapping만 한 결과
  • Texture Coordinate으로 들고 있는 normal vector를 TNB Frame으로 옮겨주어야 함


struct Vertex {
    Vector3 position;
    Vector3 normal;
    Vector2 texCoord;
    Vector3 tangent;
};

// in Pixel Shader

if (useNormalMap)
{
    float3 normalTex = g_normalTexture.SampleLevel(g_sampler, input.texcoord, 0.0).rgb
    normalTex = 2.0 * normalTex - 1.0;

    float3 N = normal;
    float3 T = normalize(input.tangent - dot(input.tangent, N) * N);
    float3 B = cross(N, T);

    float3x3 TBN = float3x3(T, B, N);

    normal = normalize(mul(normalTex, TBN))
}
  • 메시의 Vertex에서 tangent도 들고 다니기
    • tangent는 보통 바로 옆 vertex 연결해서 생성
  • Normal Texture에서 normal vector 가져오기
    • 이때 [-1, 1]로 범위 재지정 (RGB로 저장하기 때문에 0~1)
  • N은 기존 normal 사용
  • T는 혹시 모르니 N성분 빼고 사용
  • B는 N,T 외적으로 생성
  • TBN은 크기가 1인 basis이기 때문에 단순 곱으로 변환 가능


🐥 Results

Wire Frame Albedo Normal Albedo + Normal
2 3 4 5


ezgif com-crop (3)



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기