📒표면의 거칠기를 표현하는 다양한 방법
[표면의 거칠기를 표현하는 다양한 방법]

- 고퀄리티 모델링
- Normal Mapping (Bump Mapping)
- Tesselation (Displacement Mapping)
- Nanite Virtualized Geometry (Mesh shader) ???
📌Normal Mapping
: Normal에 값을 매핑시켜서, 마치 다른 면인 것처럼 연산함
Texture Type
- Vtx의 수를 유지하면서 퀄리티 높게 묘사 가능
- 실루엣: Vtx 수는 그대로 유지하되 가상의 표면 방향을 사용하는 눈속임 기법이므로, 실루엣은 변하지 않음
- 즉 큐브를 구처럼 만들거나, 튀어나온 무언가를 표현하기에는 한계가 있음
- Normal Texture: 색상 텍스처 (RGB)
- RGB를 XYZ로 매핑 (Bump Mapping의 상위호환)

[Bump Mapping]
Texture Type
- 사용: 스크래치, 모공 등 작은 디테일
- Bump Texture: Grayscale
- 색상값을 Height로 매핑

📌Tesselation
: 그래픽스 셰이더에서 정점 수 늘리기 (쪼개기)
Shader Technique
- Hull Shader + Domain Shader
- 정점 쪼개기: 임의의 메쉬를 입력받아 동적으로 여러 기본 요소로 세분화함
- 동적 세분화: 현재 시점을 기준으로 메쉬의 어느 부분을 더 세분화해야 하는지 동적으로 결정한다는 뜻
- 메시의 일부는 높은 해상도와 디테일을 가짐
- 다른 부분은 매우 낮은 해상도를 가짐
- ex, 메시의 쿼드가 카메라에서 얼마나 멀리 떨어져 있는지, 현재 카메라가 볼 수 있는지 등을 판단해 쿼드를 완전히 폐기하고 단지 2개의 삼각형으로 처리하거나, 수천개의 삼각형으로 처리하거나 선택
- 장점: 렌더링 속도가 매우 빠름 (Displacement Mapping의 상위호환)
[Displacement Mapping (& Bump Mapping)]
: 정점 수 늘리기 (쪼개기)
- Displacement Mapping은 텍스처를 기반으로 메시 정점을 실제로 변환함 (static)
- static한 변환으로 높은 비용 소모
📌Nanite
: 픽셀 스케일의 디테일 및 다수의 오브젝트를 렌더링하는 가상화 지오메트리 시스템
Geometry System
- tesellation으로 생성된 Vtx를 포함해, 렌더링되는 Vtx를 결정해 성능을 향상시킴
- 클러스터 컬링과 자동 LOD(Level of detail)를 통해 고품질 모델을 빠르게 렌더링
[Nanite]
-
UE5에 새롭게 적용된 핵심 기술
- amd에서는 primitive shader라는 이름으로 지원
- nvidia에서는 mesh shader라는 이름으로 지원

-
기술목표
- 버추얼 텍스처링처럼 지오메트리 버전
- 뷰에 따라 필요한 디테일 수준의 지오메트리 데이터만 가상화
- 폴리곤 수나 드로 콜의 제약 없이 하이폴리곤 메시를 바로 사용
- 로우폴리곤 + 노멀 맵 대신 하이폴리곤 모델을 바로 사용 가능
-
작동방식
- 로드 시: 메시를 hierachy cluster라는 단위로 묶어줌

- 렌더링 시
- 카메라 뷰를 바탕으로 클러스트의 LOD가 자동 결정됨
- 클러스터는 동일한 오브젝트 내에서 인접한 클러스트와 또다시 묶어 부모 클러스터로 만들어줌

-
장점
- 수동으로 노멀맵을 굽거나 LOD를 적용할 필요가 없기 때문에 최적화 시간을 줄일 수 있음
- 카메라에 보이는 클러스터만 렌더링하므로 성능이 좋음
- Oclusion Curing
비교군, 모든 폴리곤을 렌더링하므로 성능이 나쁨

- Clustur Curing

📒Normal Mapping
📌Normal Texture 좌표계

📌Normal Texture Type

- Tangent Space: Local 방식
- Object Space: World 방식
[Object Space]
: World 좌표 기준으로 표현된 값 (절대값)
- rgb를 world normal의 xyz로 매핑 (Normal Texture 좌표계 기준)
- 장: 연산이 간단함
- 단:
- Vtx의 변화에 대응하지 못함
- ex, 3D Animation 등
- local space 내에서 Vtx가 움직일 수 있음
- 그런 경우 Normal의 방향이 틀어짐
- 대상 모델에만 적용 가능
- 다른 모델에 적용하면 normal이 틀어져 어색함
[Tangent Space]
: local 기준으로 표현된 값
- rgb를 local normal의 xyz로 매핑 (Normal Texture 좌표계 기준)
- Normal의 좌표계 = local 좌표계 = 평면좌표계 = Tangent space
- local -> world space로의 연산 필요
📌Tangent Space 연산
[좌표계 변환에 필요한 정보]
: Vtx가 향하는 방향, 즉 Normal 방향을 가상으로 바꿔줌
- Normal, Tangent, Binormal 의 방향 조작 (매핑)
[Normal Texture 읽기]
-
회전행렬 계산
- Normal Texture 좌표계는 rgb "B"가 "Z"축이며 Normal Vector임
- 회전행렬
Normal Texture 좌표계를 고려했을 때
- X 축: tangent vector
- Y 축: binormal vector
- Z 축: normal vector

-
값 매핑
- 픽셀의 색상정보(RGB)를 벡터 표현 위한 자료형으로 사용
- RGB는 각각 0~255 저장하며, 셰이더에선 정규화해 0~1로 표현
- 음수 표현: 표현 범위를 쪼개 음수와 양수 표현
- 0 ~ 0.5 : 음수
- 0.5 : 0
- 0.5 ~ 1 : 양수
- 치환식: 샘플값 * 2 - 1
-
(OpenGL 용 텍스처인 경우) 좌표계 매핑
- OpenGL은 y축의 방향이 반대임

- 해결:
- Normal Texture 좌표계 기준 Y축, 즉 Binormal 부호를 반전시키거나
- 텍스처를 DX용으로 바꾸기
References.
[1] 3D Simulation: Bump Mapping vs Normal Mapping vs Displacement Mapping
[2] About Mapping: https://www.pluralsight.com/blog/film-games
[3] Nanite Unreal Doc: 언리얼 엔진의 나나이트 가상화 지오메트리 | 언리얼 엔진 5.1 문서
[4] Nanite Introduction: https://devjino.tistory.com/219
[5] Mesh Shader Nvida Doc: Mesh Sahder | Nvida Devloper