Normal, Normal Mapping, Tangent Space, TBN
Normal - 법선벡터

노말의 종류에는 face normal, vertex normal 이 있음
Face normal은 평면의 방정식
ax + by + cz + d =0에서
점 p0와 임의의 점 p(x,y,z)에 대해
(p-p0) dot n 이 0이 되도록 하는 점 p들의 집합이므로
따라서 pdotn – p0dotn = 0 에 대응되어
(a,b,c) = n인 face normal을 가리킴

Hard edge에서 같은 위치의 vertex라도 인접한 face의 normal에 따라서 각각 다른 normal 값을 가질 수 있음
예를 들어 큐브의 경우 한 꼭짓점에 대해서 3개의 face가 겹쳐 있기 때문에
각 face의 normal vector를 한 점에서 같이 가지고 있음
반면, smoothing을 할 때는 한 점에 인접한 face normal에 대해 sum 평균을 하여
하나의 normal을 갖도록 하는 옵션을 취할 수도 있는데, 이를 쉐이딩 관점에서
gouraud shading이라고 함.
Cpu의 메모리와 Gpu의 메모리 및 프로세서는 확장성 차원에서 서로 공유되어 있지 않고 분리되어 있는 구조이기에(일반적으로) cpu의 RAM에서 gpu의 VRAM으로 데이터를 전송할 때 지연이 무조건적으로 생길 수밖에 없음.
Vertex가 많은 high resolution의 폴리곤일 경우 지연시간이 늘어나 병목현상이 발생하기에 일반적으로
Retopology를 한 후 기존 high resolution model에 대해 여러 map을 bake한 다음 이를 low polygon에 텍스쳐로써 사용함
Highpolygon을 GPU파이프라인에서 사용할 때도 vertex shader 의 실행 횟수, primitive 개수, rasterize 비용 증가 등의 문제가 있기에 고품질 폴리곤은 기피함. 애니메이션 처리 시에도 vertex마다 weight 등이 부과되어야 하기 때문에 그만큼 모델 대비 처리 효율 성능이 떨어짐
High poly model 사용시 Vertex buffer 크기가 늘어나므로
GPU에 데이터 처리 비용이 다방면에서 커지기에 이를 normal map을 이용하여
shading에서 품질 효과가 높아 보이도록 하는 기법을 사용한다.
Normal Map은 결국은 텍스쳐로써 사용하기 때문에 UV 인 0~1 사이의 정사각형 텍스쳐에 대해서
vertex들의 uv 좌표에 대응하여 normal vector를 가리키도록 되어 있음
여기서, tangent space에서 normal map을 정의하게 된 과정의 정당성이 궁금했음.
텍스쳐로써 한정된 데이터를 담을 수 밖에 없기에
모델에 재사용성과 조건에 따른 변칙성을 고려하지 않도록 설계가 되어야 하므로
normal map을 world space에 대해서 텍스쳐를 bake하는 것은 말이 안됨.
따라서 남은 선택지는 model space와 tangent space에서 normal map을 정의하는 것
If modelspace로 정의된다면 문제점)
만약 Model Space에 대해서 normal bake를 하면 x,y,z,에 대하여 rgb에 대응할 때 무지개 색으로 표현될 것임.
텍스쳐에 대해서 -1~1까지의 매핑을 다루어야 하기 때문에 쓴다면
text*0.5 + 0.5 연산을 똑같이 했을 것
표면상으로는 이렇게 처리하게 되면 굳이 tangent space에 대해서 normal map을 생성할 필요가 있을까 라는 생각이 든다.
문제점은 object space normal map으로 하게 되면
만든 모델의 고유 xyz 공간에 대해서만 처리가 되기 때문에
model space에서 rotation이나 scaling(positive, negative)등에 대해서 재계산을 해 주어야 하고
LOD와 같이 mesh의 vertex를 직접적으로 수정되는 경우에는 해당 방법을 사용하기에 취약함

Tangent space에서 정의된것과 다르게 object space에서 정의하게 되면 x,y,z,방향에 대한 의존도가 3축 다 중요하게 됨. Tangent space는 기본적으로 z축에 대해서는 1에 가까운 direction을 보이게 되므로(특정 지점에 대한 극소평면의 법선 방향이므로, normal map이 기본적으로 푸르스름한 색상을 띄게 되는 이) 의존성을 줄일 수 있음
Gpu가 texture를 vram에 적재할 때
텍스쳐 sampling 과정에서 tangent space에 정의된 normal map은 z방향에 대한 값 차이가 크지 않아 텍셀간 interpolation 할 때에도 값의 변화가 작지만
Object space에서는 x,y,z에 대한 의존도가 제각각 다르기 때문에 tangent space에서 정의된 normal map보다 왜곡이 커짐
Ex) tangent space
(0,0.1,1) (0,0.2,0.9)
Object space
(-0.3,-0.5,-0.3)/ (0.5,0.3,0.9)
이런 식으로 되면(과장되게)
두 position에 대해서 interpolation 시 object space에서 정의된 normal map을 사용할시에 왜곡이 커지게 되는 것
텍스쳐 압축 친화성에서도 tangent space에서 정의되는 것이 좋다
한편, Model space 내에서도 normal 방향이 바뀔 수 있음
animation, skinning 처리에 normal 방향이
joint 회전에 따라서 무조건 변형되는데 이에 따라
base position에 대해서 특정 지점의 normal 연산처리를 joint의 matrix에 대하여
일일이 처리해주는 것이 더욱 큰 자원 낭비임
따라서, normal map 텍스쳐를 정의할때는
Tangent Space(특정 지점의 극소 평면 공간) 에서 정의하고 이를 이용해
model 공간 -> world 공간으로 데이터를 이용, 확장해 나간다.
'Unity Study' 카테고리의 다른 글
| 2026-01-10_ GetWorldSpaceNormalizeViewDir -Not Solved (0) | 2026.01.10 |
|---|---|
| 2026-01-08_Gamma Correction & GPU Texture Compression (0) | 2026.01.08 |
| 2025-01-02_Unity Blender Coordinate Difference (0) | 2026.01.03 |
| 2025-12-17_SmoothDamp, Critical Damped Oscillation (1) | 2025.12.17 |
| 2025-12-08_TPS System Basic (0) | 2025.12.08 |