Normal Mapping
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Normal Mapping
Texture | Tangent Frame |
---|---|
- 원래 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 |
---|---|---|---|
댓글 남기기