References
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/nanite-virtualized-geometry-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/virtual-shadow-maps-in-unreal-engine
기본 구성 요소


3차원 가상공간에서 모든 물체는 Polygon mesh로 표현됨.
(GPU가 폴리곤 메쉬 처리에 최적화되어 있기 때문.)
폴리곤 = 다각형이지만, 그래픽에서는 주로 삼각형을 의미함.
위 그림에서 알 수 있듯이 폴리곤이 많아질수록 더 정교하게 표현됨.
이러한 폴리곤 메쉬는 정확한 곡면이 아니라, 곡면에 근사한 표현

Mesh 표면에 입히는 이미지가 Texture

Texture 자체는 2차원이기 때문에,
3차원 Mesh의 어느 위치(u,v)에 붙일지 정해주는 UV mapping이 필요함.

단순히 Texture를 붙이는게 아니라,
빛이 물체 표면에서 어떻게 반사/흡수되는지를 고려해야 함. (금속, 거친 콘크리트, 투명한 유리,,)
즉, 질감 표현
PBR(Physically Based Rendering)
빛과 물질의 상호작용을 실제 물리 법칙에 가깝게 모델링함으로써,
서로 다른 조명 환경에서도 일관된 시각적 결과를 얻도록 함.
보통 3D 엔진은 PBR 기반의 Materail 시스템임.
빛이 있어야 물체를 볼 수 있고, 그림자가 생기고, 입체감이 생긴다.

Normal Vector : 하나의 삼각형에서 그 면에 수직 방향인 벡터
삼각형 p1, p2, p3 에서
v1 = p2 - p1
v2 = p3 - p1
v1 x v2 (외적) = Normal Vector
정규화하면
n = (v1 × v2) / ||v1 × v2||
(크기는 신경 안써도 됨, 방향만 중요!!)
이 Normal Vector가 빛이 어디서 들어올 때 밝아질지/어두워질지를 결정함.

외적은 순서를 바꾸면 방향이 반대가 되므로,
v1 × v2 ≠ v2 × v1
v2 × v1 = -(v1 × v2)
Normal Vector 방향도 반대가 됨.
여기서
빛은 바깥에서 들어오기 때문에 법선은 물체의 바깥쪽을 향해야 함.
*안쪽을 향한다면? 어두워지거나, 아예 안보이는 면이 생김.
Face Normal : 위처럼 하나의 삼각형에서 계산한 법선

하지만 실제 렌더링에서는 보다 부드러운 곡면 표현을 위해 Vertex Normal을 사용함.
Vertex Normal : 인접한 여러 삼각형의 Face Normal들의 평균
-> 폴리곤 수를 늘리지 않고도 곡면처럼 보이게 만드는 기법
기존 3D Rendering에서는
폴리곤 수를 증가시키면 -> 디테일한 표현이 가능하지만, 성능이 저하됨.

Nanaite의 아이디어
모든 기하 데이터를 항상 GPU에 올려두는게 아니라,
카메라에 보이는 부분만 스트리밍하고, 보이지 않는 부분은 로드하지 않음.
따라서 카메라가 스트리밍 하고 있는 곳만 메모리를 차지함.
가끔 배그나 3D 지도를 보다보면 현재 뷰에서 상하좌우로 이동할 때
타일 단위로 로드되면서 살짝 버벅이는 현상도 바로 이런 원리

기존 Shadow Map은 해상도가 고정되어 있어서 멀리 갈수록 품질이 저하되고,
고밀도 메쉬에 취약함.
Nanaite가 등장하면서, 초고밀도 메쉬 처리가 가능해졌지만,
그림자 품질이 이를 따라가지 못하면 시각적 불일치가 발생함.

VSM
초고해상도 그림자 맵을 128x128 타일 단위로 분할하여 관리함.
화면에 실제로 필요한 타일만 할당/렌더링 됨.
따라서 Nanaite와 VSM 둘다 필요한 만큼만 스트리밍하여 계산하는 원리.