"밝기가 아닌 '거리'를 계산."
마모셋, 서브스턴스 페인터 등의 Height Map 생성기들은 '검은색은 낮다'는 단순 논리 때문에, 짙은 색 텍스처에서 항상 아티팩트가 발생했습니다. 저는 이 문제를 해결하기 위해 “레오나르도 다 빈치의 ‘공기원근법’ 을 셰이더로 구현했습니다.
- *Lab 색차(Delta-E)**로 대기와의 거리를 측정하고,
- 채도(Saturation) 감소량으로 빛의 산란 거리를 계산하며,
- 색상 온습도(Color Temperature)에 따른 진출/후퇴색 착시까지 Z축 데이터에 반영했습니다.
결과적으로, 색상이 어두워도 선명하면 '튀어나온 것'으로 인식되는 지각 기반(Perceptual) 깊이 추정 엔진을 완성했습니다.
1. "대기 산란(Atmospheric Scattering)의 수학적 구현"
코드 증거: baker.wgsl - passZ 내부 z_white 계산
- 원리
멀리 있는 물체일수록 대기 입자에 의해 빛이 산란되어 '배경색(Atmosphere Color)'과 비슷해집니다.
- 구현
- RGB를 CIE Lab 색공간으로 변환했습니다. (인간의 눈이 인지하는 거리감을 위해 RGB 대신 Lab 사용)
dE(Delta-E): 현재 픽셀과W_L, W_a, W_b(대기 기준색) 사이의 지각적 거리를 측정합니다.z_white = clamp01(1.0 - dE / 60.0): 대기 색과 비슷할수록(거리가 가까울수록)Z값(깊이)을 높게 잡았습니다.
맵 베이커 사용방법입니다.
- 단순히 하얀색을 찾는 게 아닌, Lab 공간에서의 색차(Delta-E)를 이용해 대기의 밀도를 역산출했습니다.
이미지를 선택한 후, 화이트와 주조색(흰색)을 마우스 커서로 클릭하면 노멀맵, AO 등을 추출합니다.
2. "채도 감쇠(Saturation Decay) 시뮬레이션"
코드 증거: baker.wgsl - passZ 내부 z_sat 계산
- 원리
빛이 공기를 통과할수록 파장이 섞이면서 채도(Saturation)가 떨어집니다. 즉, **"선명하면 가깝고, 탁하면 멀다"**는 원리입니다.
- 구현:
s = sat01(rgb)로 채도를 구한 뒤,z_sat = 1.0 - s로 반전시켰습니다.- 채도가 낮을수록(탁할수록) 먼 거리(High Z)로 인식하게 설계했습니다.
- "검은 물체라도 채도가 높으면(선명한 검정) 가깝게 인식합니다. 기존 툴의 '검은색 = 구멍' 오류를 광학적 특성으로 해결했습니다."
3. "색채 원근법(Chromostereopsis) 적용"
코드 증거: baker.wgsl - passZ 내부 z_shift 계산
- 원리
인간의 수정체는 파장에 따라 굴절률이 달라서, 난색(Red)은 튀어나와 보이고 한색(Blue)은 들어가 보입니다.
- 구현:
rb = (rgb.x - rgb.z) * 0.5 + 0.5: Red 채널과 Blue 채널의 차이를 계산했습니다.- Dominant Hue(주조색)와의 편차를 계산해, 환경광 내에서의 상대적인 전진/후퇴감을 수치화했습니다.
- "물리적 거리뿐만 아니라, 인간 시각 시스템(HVS)의 착시 현상까지 Z축 가중치로 반영하여 '느낌적인 입체감'을 데이터로 만들었습니다."