- 이 글은 닌텐도 64 데모 개발 과정에서 적용한 팔레트 기반 조명 및 노멀 매핑 기술을 설명함
-
직접 텍스처에 즉시 라이팅을 반영하는 대신, 팔레트만 변경해 텍스처 전체에 조명 효과를 주는 방법을 소개함
-
diffuse/normal 팔레트 압축 및 오브젝트 공간 노멀 매핑 등 다양한 최적화 기법을 활용함
- 이 방식은 방향성 조명에 한해 효율적이며, 쉐이딩 불연속성 등 단점이 존재함
- 데모에서는 반사광/직접광/환경광 등 여러 요소가 창의적으로 결합되어 N64 한계에서 인상적 비주얼을 보여줌
소개 및 목표
- 이 글은 Bluesky에서 시작한 스레드의 연장선으로, 닌텐도 64용 데모(Revision 2025)에서 활용한 진보된 라이팅 기법을 공유함
- 데모에는 반사광이 적용된 노멀 매핑, 실시간 반사 조명 등 다양한 효과가 포함되고, 음악은 noby가 작곡, Moloko가 기타를 연주함
닌텐도 64에서의 노멀 매핑 가능성
- WadeTyhon과 Spooky Iluha 등 홈브루 개발자들의 실험을 참고해 N64에서의 노멀 매핑 구현 가능성을 검증함
- 기본 방식은 실행 시간에 CPU에서 텍스처에 직접 조명을 연산하는 것임
- 하드웨어 지원 없이 CPU로 쉐이딩 커스텀 코드 실행 가능하지만, 속도 저하 문제가 큼
팔레트 기반 쉐이딩
- 텍스처 공간 쉐이딩을 직접 적용하는 대신, 팔레트 텍스처의 팔레트 데이터만 업데이트하면 전체 텍스처가 실시간으로 밝기 변화를 반영함
- N64는 팔레트 텍스처 사용이 흔하므로 흔히 활용 가능함
- 팔레트만 업데이트해도 각 텍셀별로 실제 조명을 적용한 것 같은 효과가 즉시 나타남
- 원본 팔레트를 쉐이딩 적용된 팔레트로 교체하고, 기존 팔레트 텍스처를 오브젝트에 일반 텍스처로 매핑함
- 디퓨즈(dot(N,L)) 라이팅만 적용해도 상당히 뛰어난 결과물을 보여줌
오브젝트 공간 노멀 매핑
- 일반적으로 노멀 매핑은 텐전트 공간에서 이루어지며, 반복 텍스처 지원 및 자연스러운 표면 보정에 적합함
- 오브젝트 공간 노멀 맵은 각 텍셀이 정확한 표면 노멀 정보를 가지므로 계산이 단순하지만, 반복 텍스처 활용이 어려움
- 고해상도 노멀 맵을 32색 팔레트로 압축해도 원본과 유사한 특성을 유지 가능함
디퓨즈와 노멀이 공유된 팔레트 설계
- 오브젝트는 디퓨즈 텍스처(basecolor * ao)와 노멀 맵을 가짐
- 두 텍스처 모두 K-means 군집 알고리듬으로 생성된 동일한 팔레트 인덱스를 공유하도록 구성함
- 이미지를 6채널 이미지로 간주해 클러스터링을 진행함
- 예시에서는 RGB 디퓨즈 + 노멀 맵을 16색 팔레트로 압축해, 이미지 데이터는 4bpp만 기록하면 됨
- 쉐이딩 시, 각 팔레트 색상에 대해 노멀 및 표면 색상 정보를 인덱스로 조회해 새 RGB 색상을 생성함
- 이 방식은 방향광만 제대로 지원 가능하고, 팔레트만으로 섀도우를 구현하긴 어려움
굽기(baked)된 방향성 환경광/태양광
-
건물의 사실적인 라이팅을 구현하고자, 버텍스 컬러의 RGB와 알파 채널을 환경광, 태양광에 각각 사용함
-
환경광(ambient)은 방향성 강도(그레이스케일 환경맵) 와 컬러(RGB, 채도 강화)로 분리함
-
태양광(direct)은 버텍스 알파에 전달함
-
기본 라이팅 공식은 아래와 같음
ambient = vertex_rgb * grey_irradiance_map(N)
direct = vertex_alpha * sun_color * dot(N, sun_dir)
color = diffuse_texture * (ambient + direct)
-
각각의 항들이 합쳐져 최종 색상을 만듦
-
방향성 환경광은 빵빵하게 자연광 효과를 내며, 팔레트 기반이지만 높은 품질의 질감을 연출함
-
환경맵은 단순화를 위해 등각원통 투영(equirectangular projection)을 활용함
반복 텍스처 적용 대형 모델의 쉐이딩
- 초기 알고리듬은 단일 오브젝트용이며, 대형 캐슬 메시는 반복 텍스처 사용으로 인해 문제가 발생함
- 해결을 위해 Blender를 활용해, 각 표면 방향/재질별로 메시를 서브메시 단위로 분리함
- 컴퓨터는 각 그룹에 폴리곤 노멀을 이용해 world-to-model 행렬을 산출함(근사 텐전트 공간)
- 각 그룹은 하나의 팔레트를 공유해, 전체적으로는 평균적인 라이팅 품질이 보장됨
- 텐전트 공간이 런타임에 보간되지 않아 면이 깎인 듯한(face) 라이팅이 나타나는 단점이 존재함
스페큘러(반사광) 쉐이딩
- 여러 표면 지점이 동일한 팔레트 색상을 공유하므로, 정확한 포인트 라이트/반사광 쉐이딩은 불가능함
- 팔레트 공간 기법은 방향성 디퓨즈 라이팅에 한해 효율적임
- 그래도 구형 개체를 가정해, 각 점을 p = radius * normal로 근사하여 스페큘러 반사광 효과를 억지로 구현함
- 결과는 다소 불연속적이지만, 플레이 중 실제로는 상당히 자연스러운 느낌을 줄 수 있음
한계와 미래
-
데모에서는 쉐이딩 불연속성, 흑백 텍스처만 지원, 포인트라이트 미지원 등의 한계를 최대한 숨겼음
-
elaborate preprocessing(복잡한 사전 처리)이 필수적임
-
쉐이딩 불연속성 없이 ambient/direct 조명 모두 지원하는 방법은 여전히 도전 과제임
-
실험 결과에 대해 새로운 가능성과 아이디어의 흥미로움을 강조함
-
PAL 호환 N64 ROM 파일도 공개되어 있음. 단, 불안정하여 자주 다운됨
기타
- 저자는 책 집필도 고려 중이며, 관심이 있다면 이곳에서 소식을 받아볼 수 있음