- Revision 2025용 Nintendo 64 데모는 텍스처 전체를 다시 계산하지 않고 팔레트만 갱신해 노멀 매핑, 베이크된 조명, 실시간 스페큘러에 가까운 효과를 냄
- CPU가 각 팔레트 인덱스에서 노멀과 확산색을 읽어 새 RGB 팔레트를 만들면, 팔레트 텍스처가 텍셀별 조명을 받은 것처럼 반응함
- 확산 텍스처와 노멀 맵은 같은 팔레트 인덱스를 공유하며, scikit-learn의 K-means clustering으로 6채널 이미지처럼 묶어 생성됨
- 건물 조명은 정점 RGB의 앰비언트 색, 정점 알파의 태양 가시성, 회색 irradiance map, 방향성 태양광의
dot(N, sun_dir)을 조합함
- 방향성 확산광에는 효과적이지만 그림자, 포인트 라이트, 정확한 스페큘러, 반복 텍스처가 있는 큰 모델에서는 제약이 커서 전처리로 한계를 감춰야 함
팔레트만 갱신해 셰이딩하기
- Nintendo 64 데모는 Revision 2025용으로 제작됐고, 베이크된 조명, 노멀 매핑, 실시간 스페큘러 셰이딩에 가까운 효과를 사용함
- N64에서 노멀 매핑은 기존 홈브루 실험으로 가능성이 알려져 있었고, 이 데모는 런타임에 텍스처가 아니라 조명 결과 팔레트를 계산하는 쪽을 택함
- 전용 하드웨어 지원 없이 CPU에서 임의의 셰이딩 코드를 실행할 수 있지만, 계산 속도는 느림
- 팔레트 텍스처에서는 텍셀 전체가 아니라 팔레트만 바꿔도 텍스처 전체가 조명 계산을 받은 것처럼 보임
- 원래 팔레트는 셰이딩된 팔레트로 대체됨
- 팔레트 텍스처는 일반 텍스처처럼 오브젝트에 적용됨
- 단순한 확산광
dot(N,L)만으로도 결과가 꽤 좋아 보임
- 초기 예시는 색상 텍스처의 감마 보정을 되돌려 선형 공간에서 셰이딩했지만, 최종 데모에서는 앰비언트와 직접광 항을 분리해 N64의 RDP 유닛에서 하드웨어로 합성해야 해서 적용하지 못함
오브젝트 공간 노멀 매핑
- 일반적인 노멀 매핑은 접선 공간에서 수행됨
- 반복 텍스처를 사용할 수 있음
- 세부 노멀이 부드럽게 변하는 정점 노멀을 보정할 수 있음
- 단일 색상의 접선 공간 노멀 맵은 매끄러운 표면을 나타냄
- 오브젝트 공간 노멀은 계산이 단순한 대신 제약이 큼
- 노멀 맵의 텍셀은 정점 노멀로부터의 편차가 아니라 절대 표면 노멀을 나타냄
- 런타임 계산은 텍스처에서 색을 읽는 수준으로 단순해짐
- 모든 표면 지점에 라이트맵처럼 고유한 텍셀이 필요함
확산 텍스처와 노멀 맵이 공유하는 팔레트
- 오브젝트는 확산 텍스처
basecolor * ao와 노멀 맵을 모두 가짐
- 두 텍스처는 같은 팔레트 인덱스를 공유하며, 이 인덱스는 scikit-learn의 K-means clustering으로 생성됨
- 이미지들은 하나의 6채널 이미지처럼 해석됨
- 하나의 인덱스로 노멀과 표면 확산색을 모두 가져올 수 있음
- 로딩 시점 또는 매 프레임마다 팔레트 색을 순회함
- CPU 셰이더 코드가 각 인덱스에 대해 새 RGB 색을 만듦
- 루프 결과가 조명이 적용된 새 팔레트가 됨
- 이 접근은 실제로는 방향성 조명에 가장 잘 맞음
- 팔레트만으로는 그림자 같은 효과를 표현하기 어려워, 베이크된 조명과 결합해야 함
베이크된 방향성 앰비언트와 태양광
- 데모의 건물에는 더 현실적인 조명을 넣기 위해 앰비언트와 직접 태양광을 정점 색상에 분리해 저장함
- 정점 RGB: 앰비언트 색
- 정점 알파: 태양 가시성
- 앰비언트 항은 방향성 강도와 색상으로 나뉨
- 방향성 강도는 회색조 irradiance map
- 색상은 채도를 높인 정점 RGB
- 태양은 방향성 조명이며, 가시성은 정점 알파로 전달됨
- 셰이딩 공식은 다음과 같음
ambient = vertex_rgb * grey_irradiance_map(N)
direct = vertex_alpha * sun_color * dot(N, sun_dir)
color = diffuse_texture * (ambient + direct)
- 지저분한 태양 가시성 정점 색상은
N.L 계산으로 마스킹되어 최종 직접광 결과에 정리되어 반영됨
- 방향성 앰비언트는 베이크된 조명이 거칠어도 텍스처 디테일 덕분에 결과가 고급스럽게 보일 수 있음
- 흐린 환경 맵에는 단순함 때문에 equirectangular projection을 사용함
- Polyhaven HDRI가 이미 이 투영을 사용함
- 셰이딩을 로드 시점에 미리 계산했기 때문에 복잡한 샘플링 수학이 문제가 되지 않음
반복 텍스처가 있는 큰 모델 처리
- 원래 셰이딩 알고리듬은 단일 오브젝트용으로 설계됐고, 초기에는
potato_rock.obj로만 테스트됨
- 데모의 성곽 메시에는 반복 텍스처가 있어 문제가 생김
- 우회책은 큰 메시를 여러 서브메시로 나누고, 각 서브메시가 개념적으로 같은 오브젝트 공간 노멀 맵을 공유하게 만드는 방식임
- Blender에서 재질과 표면 방향 기준으로 지오메트리를 수동 그룹화함
- 각 그룹의 폴리곤 노멀을 기반으로 world-to-model 행렬을 계산함
- 이 행렬은 대략적인 접선 공간에 가까움
- 각 그룹은 팔레트를 공유하므로 전체 조명은 평균적인 의미에서만 맞음
- 접선 공간은 런타임에 보간되지 않아 면 단위 조명처럼 보이며, 이 점이 기법의 가장 큰 단점 중 하나임
스페큘러 셰이딩의 근사
- 여러 표면 지점이 같은 셰이딩 색을 공유하기 때문에 포인트 라이트나 스페큘러 셰이딩을 정확히 계산하기 어려움
- 팔레트 공간 접근은
to camera 벡터 V가 필요 없는 확산 방향성 조명에 잘 맞음
- 스페큘러 효과는 오브젝트를 구로 근사하는 방식으로 시도함
- 셰이딩할 점
p를 p = radius * normal로 둠
- 많은 표면 지점이 같은 팔레트 인덱스를 공유하므로 결과는 각져 보일 수밖에 없음
- 데모의 스페큘러 하이라이트는 다소 이상해 보였지만, 대부분의 사람을 속일 정도로는 동작함
한계와 관련 자료
- 데모에서는 주요 한계를 전처리와 장면 구성으로 숨기려 함
-
조명 불연속과 표현 범위
- 회색조 텍스처만 지원함
- 포인트 라이트는 없음
- 이 기법은 정교한 전처리가 있을 때만 실용적임
- Spooky Iluha의 기법에는 조명 불연속 문제가 없지만, 앰비언트와 직접광을 모두 유지하면서 같은 문제를 해결할 수 있는지는 알 수 없음
-
ROM과 이전 연구