book/40-tech-bangs-shadow-and-stencil-layering.md

40. 기술 심화: Bangs Shadow + Stencil Layering

앞머리 그림자와 얼굴/눈 레이어를 stencil로 분리하는 패턴

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 마스크가 얼굴과 깊이 정합이 깨짐

실무 체크리스트

Sources (섹션 단위 인용)