Slab/Atlas · Glass reflection · Dust

창문 너머 — 풀 셰이더 버전

폴리곤은 여전히 평면 하나. 방 표면은 슬랩/아틀라스 텍스처에서 면별로 샘플하고, 그 위에 유리 반사(프레넬)와 먼지·얼룩 레이어를 얹었어. 드래그로 시점을 돌려봐 — 방은 패럴랙스로 미끄러지지만 먼지·반사는 유리 표면에 붙어 있는 게 보일 거야.

drag · 시점 회전
뒷벽 (col 0) 바닥 (col 1) 천장 (col 2) 왼쪽벽 (col 3) 오른쪽벽 (col 4)
core 핵심 셰이더 — ray-box → atlas 샘플 → 유리 레이어
// 1) 해석적 ray-box (반복/마칭 없음)
vec3 pos = vec3(uv*2.0-1.0, -1.0);
vec3 k   = abs(1.0/rd) - pos*(1.0/rd);
float t  = min(min(k.x,k.y),k.z);
vec3 hit = pos + rd*t;

// 2) 닿은 면 -> 아틀라스 col(back/floor/ceil/L/R) + 방 variant row
//    면 위 2D 좌표를 atlas 셀로 매핑해서 texture2D 한 번 샘플
vec2 uvA = atlasUV(colIdx, variant, faceLocalUV);
vec3 room = texture2D(u_atlas, uvA).rgb;

// 3) 유리 반사 — 프레넬(시야각이 누울수록 강해짐), 유리에 고정
float fres = 0.10 + reflStr*pow(1.0-abs(rd.z), 2.0);
room = mix(room, envReflection(v_uv, yaw), fres);

// 4) 먼지/얼룩 — v_uv 기반이라 패럴랙스 X (= 표면에 붙어있음)
float grime = fbm(v_uv*7.0);
room *= 1.0 - grime*dustStr;