Normal Map 관련 자료 스크랩 + Normal 을 RGB로 변환, 역변환 계산
버텍스의 노멀 벡터 값을 노멀맵의 RGB로 변환하는 계산식
버텍스의 노멀 벡터 값을 노멀맵의 RGB로 변환하는 계산식은 다음과 같다.
버텍스의 노멀 벡터는 일반적으로 정규화되어 있다. 이를 (x, y, z)로 나타낸다.
RGB 값은 일반적으로 0에서 1 사이의 범위를 가진다.
따라서 각각의 컬러 채널(R, G, B)은 다음과 같이 계산된다:
R = (x + 1) / 2
G = (y + 1) / 2
B = (z + 1) / 2
이 계산식은 각각의 노멀 벡터 요소를 0에서 1 사이의 값으로 매핑하여 RGB 값으로 변환한다.
이렇게 계산하는 이유는 다음과 같다:
1. 노멀맵의 RGB 값의 범위는 0에서 1 사이여야 한다. 버텍스의 노멀 벡터는 보통 정규화되어 있으며, 이를 RGB 값으로 변환할 때 0에서 1 사이의 값으로 스케일링해야 한다.
2. RGB 값의 각 채널은 표면의 방향을 나타내야 한다. 따라서 노멀 벡터의 각 요소를 RGB 값으로 매핑할 때, x, y, z 요소는 각각 R, G, B 채널과 일치시켜야 한다.
3. 시각적으로 이해하기 쉽게 만들기 위해 일반적인 컬러 스페이스를 사용한다. 0에서 1 사이의 RGB 값은 시각적으로 이해하기 쉽고 다루기 간편한 컬러 스페이스이다.
rgbNormal = (normalVector + 1.0) * 0.5
여기서 normalVector는 (-1, -1, -1) ~ (1, 1, 1) 범위의 3차원 벡터이고, rgbNormal은 (0, 0, 0) ~ (1, 1, 1) 범위의 RGB 값
이렇게 계산하는 이유는 다음과 같다:
1. 노멀 벡터 범위 변환.
기존 노멀 벡터의 값 범위는 (-1, -1, -1) ~ (1, 1, 1). 그러나 RGB 색상 값의 범위는 (0, 0, 0) ~ (1, 1, 1). 따라서 노멀 벡터 값의 범위를 RGB 범위로 변환해야 한다.
2. 값 이동
normalVector + 1.0을 하면 노멀 벡터 값의 범위가 (0, 0, 0) ~ (2, 2, 2)가 된다.
3. 값 스케일링
* 0.5를 하면 값의 범위가 (0, 0, 0) ~ (1, 1, 1)로 RGB 범위에 맞춰진다.
이렇게 계산하면 노멀 벡터의 방향 정보가 RGB 값으로 잘 보존되어 노멀맵 텍스처에 저장될 수 있다. 렌더링 시에는 이 RGB 값을 다시 노멀 벡터 값으로 변환하여 사용한다.
노멀맵의 RGB 값을 다시 노멀 벡터로 변환
노멀맵의 RGB 값을 다시 노멀 벡터로 변환하여 픽셀 셰이더에서 조명 계산에 사용하는 HLSL 코드는 다음과 같습니다:
// 노멀맵에서 노멀 벡터 구하기
float3 sampledNormal = normalMap.Sample(samLinear, input.uv).rgb;
float3 normal = 2.0 * sampledNormal - 1.0;
여기서 sampledNormal은 노멀맵에서 샘플링한 RGB 값이고, normal은 실제 노멀 벡터 값.
normal = 2.0 * sampledNormal - 1.0; 이 식은 다음과 같이 동작:
1. sampledNormal의 RGB 값 범위는 (0, 0, 0) ~ (1, 1, 1).
2. 2.0 * sampledNormal을 하면 값의 범위가 (0, 0, 0) ~ (2, 2, 2)가 된다.
3. - 1.0을 하면 값의 범위가 (-1, -1, -1) ~ (1, 1, 1)로 변환되어 노멀 벡터 값의 범위와 동일해진다.
이렇게 변환된 normal 벡터를 사용하여 조명 계산(광원 벡터와 노멀 벡터의 내적 등)을 수행하면 노멀맵에 저장된 미세한 기하 구조 정보에 따라 정확한 조명이 적용.
Unity Document : Normal Map
https://docs.unity3d.com/kr/current/Manual/StandardShaderMaterialParameterNormalMap.html
NormalMap Shader
https://gist.github.com/enghqii/eb99185fc029b9eb46fa
NormalMap Wikipedia
https://en.wikipedia.org/wiki/Normal_mapping
UPR 셰이더 코딩 튜토리얼 : 제 3편 - 커스텀 라이트 맵, 에디셔널 라이트, fake Shadowmask (feat : TS Normal)
(글 중간에 Tangent Space Normal 관련 설명이 상세히 작성돼있음)
https://blog.naver.com/mnpshino/221869618181