40. 기술 심화: Bangs Shadow + Stencil Layering
[B] 앞머리(bangs)는 얼굴에서 가장 눈에 띄는 “겹침” 요소라, 물리적으로 정확한 그림자보다 가독성/레이어 우선순위가 더 중요해집니다. 이 문서는 bangs shadow를 “그럴듯한 보정”으로 취급하고, URP에서 재현 가능한 stencil 레이어링 계약으로 고정합니다.
- [B] 목표: 앞머리-얼굴-눈 레이어 충돌(투명/반투명/소팅)을 줄이고, 컷마다 결과가 달라지지 않게 만든다.
- [B] 핵심: “마스크(pass1) -> 적용(pass2)”으로 책임을 분리하고, stencil bit를 예약해 다른 효과와 충돌을 막는다.
목적
- [B] 앞머리-얼굴 충돌 영역을 stencil 기반으로 안정화한다.
- [B/C] 저비용 투영 트릭의 적용 범위와 한계를 명시한다.
증거 등급 요약(A/B/C)
- [B] bangs shadow + stencil 분할 사례 반복
- [C] 측면/후면 카메라에서 한계 존재
핵심 개념
서론: bangs shadow는 “물리”가 아니라 “인지(지각)”를 맞춘다
- [B] 목표는 실제 그림자 재현이 아니라, 앞머리가 얼굴 위에 얹혔다는 깊이감을 안정적으로 느끼게 하는 것이다.
- [B] 따라서 광원/거리/각도에 따라 자연스럽게 약화되도록 만들되, 레이어 충돌이 생기면 즉시 룩이 무너지는 문제를 먼저 해결한다.
개론: stencil layering이 해결하는 문제
- [B] 소팅만으로 bangs/눈썹/속눈썹/눈 하이라이트를 해결하려 하면, 카메라 각도/플랫폼에서 결과가 달라진다.
- [B] stencil은 “이 픽셀은 bangs 영역이다”를 버퍼에 남겨, 이후 패스에서 조건부로 적용할 수 있게 해준다.
이론: stencil은 ‘비주얼’이 아니라 ‘계약’이다
- [B] stencil bit는 효과 단위로 예약해야 한다. 같은 bit를 다른 효과가 쓰면, 특정 씬에서만 깨지는 회귀가 생긴다.
- [B] bangs shadow는 보통 아래 2패스로 분리한다.
- [B] 1)
BangsMask패스: depth와 정합된 bangs 영역을 stencil에 기록(색 출력 없음) - [B] 2)
FaceApply패스: face 셰이딩에서 stencil을 읽고, 해당 영역에만 tint/감쇠를 적용
심화: URP에서의 구현 포인트(ShaderLab 스텐실 상태)
ShaderLab
// BangsMask (ColorMask 0로 “마스크만” 남김)
Stencil
{
Ref 1
Comp Always
Pass Replace
}
ColorMask 0
ZWrite On
ZTest LEqual
ShaderLab
// FaceApply (stencil==1인 곳만 bangs shadow 적용)
Stencil
{
Ref 1
Comp Equal
Pass Keep
}
HLSL
// 개념: stencil이 찍힌 영역만 얼굴 명암을 약간 눌러 “앞머리 그림자” 인상을 만든다.
float3 ApplyBangsShadow(float3 faceColor, float bangsMask /*0..1*/)
{
return lerp(faceColor, faceColor * _BangsShadowTint.rgb, bangsMask);
}
- [B/C] 측면/후면에서는 bangs가 얼굴을 가리지 않거나, 마스크가 부자연스럽게 겹칠 수 있으므로 각도 기반으로 강도를 약화(fade)하는 fallback이 필요하다.
URP 매핑 포인트
설계 해석
-
[B] RendererFeature에서 pass 순서를 고정하지 않으면 카메라/플랫폼마다 결과가 달라져 회귀가 반복된다.
-
[B/C] queue 분리는 품질뿐 아니라 모바일 overdraw 제어에도 직접적인 영향을 준다.
-
[B] pass 순서를 RendererFeature에서 고정
-
[B] face/bangs 재질 queue를 분리
-
[B] 권장 순서(개념):
-
[B] 1)
BangsMask를 먼저 렌더링(스텐실 기록) -
[B] 2)
FaceApply에서 스텐실을 읽어 부분 감쇠 -
[B] 3) 눈/하이라이트/투명은 마지막에 별도 큐로 처리(소팅 충돌 최소화)
실패 패턴/오해
- [B] stencil ref 충돌
- [B] render queue 역전
- [B]
ColorMask 0누락으로 마스크 패스가 화면에 찍혀버림 - [B]
ZTest/ZWrite설정 오류로 bangs 마스크가 얼굴과 깊이 정합이 깨짐