2. Texture Roughness

DV·2024년 5월 8일

DirectX_3D

목록 보기
3/13

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


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

  • 고퀄리티 모델링
  • 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 좌표계

  • (주의) DX식이 아님!
  • Unreal식임

📌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 읽기]

  1. 회전행렬 계산

    • Normal Texture 좌표계는 rgb "B"가 "Z"축이며 Normal Vector임
    • 회전행렬
      Normal Texture 좌표계를 고려했을 때
      • X 축: tangent vector
      • Y 축: binormal vector
      • Z 축: normal vector
  2. 값 매핑

    • 픽셀의 색상정보(RGB)를 벡터 표현 위한 자료형으로 사용
    • RGB는 각각 0~255 저장하며, 셰이더에선 정규화해 0~1로 표현
    • 음수 표현: 표현 범위를 쪼개 음수와 양수 표현
      • 0 ~ 0.5 : 음수
      • 0.5 : 0
      • 0.5 ~ 1 : 양수
    • 치환식: 샘플값 * 2 - 1
      • 연산결과 -1~1로 표현 가능
  3. (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

0개의 댓글