book/37-tech-hair-spec-lobe-and-flow-control.md

37. 기술 심화: Hair Spec Lobe + Flow Control

머리카락 하이라이트를 이중 로브와 흐름 방향으로 제어하는 패턴

37. 기술 심화: Hair Spec Lobe + Flow Control

[B] 헤어는 서브컬쳐 룩에서 “가장 많은 정보를 담는 재질”이고, 동시에 “가장 먼저 깨지는 재질”입니다. 일반적인 PBR 스페큘러(GGX)를 그대로 쓰면 머리카락이 금속처럼 보이거나, 카메라 이동에 따라 하이라이트가 떨리기 쉽습니다.

  • [B] 목표: 하이라이트를 “형태 읽기(큰 덩어리)”와 “가닥 리듬(얇은 덩어리)”로 분리하고, 방향(flow)으로 제어한다.
  • [B] 핵심: 이방성(섬유 방향) 신호를 tangent/bitangent 또는 flow map으로 확보하고, dual-lobe로 합성한다.

목적

  • [B] 헤어 하이라이트를 형태 중심으로 설계한다.
  • [B] dual-lobe + flow 제어를 표준화한다.

증거 등급 요약(A/B/C)

  • [B] 역분석에서 dual-lobe/view-shift가 반복
  • [C] 로브 함수형/파라미터는 프로젝트별 차이

핵심 개념

서론: 헤어 스펙은 “방향성”이 전부다

  • [B] 헤어카드/스트랜드는 섬유 방향이 명확해서, 하이라이트가 “표면 노멀”보다 “섬유 방향”에 더 강하게 반응해야 자연스럽다.
  • [B] 따라서 헤어 스펙은 일반 BRDF를 재사용하기보다, 방향(T)과 시선/광원(V/L) 관계로 별도 모델을 두는 편이 안정적이다.

개론: 입력 계약(어떤 데이터를 믿을지)

  • [B] 1순위: 메쉬 tangent/bitangent가 신뢰 가능하면 이를 기준으로 한다.
  • [B] 2순위: tangent가 불안정하면 flow map(RG)을 추가해 “가닥 방향”을 텍스처로 고정한다.
  • [C] flow map은 seam/미러 UV에 취약하므로, “헤어 영역”에만 적용하고 바디와 공유하지 않는다.

이론: dual-lobe가 필요한 이유

  • [B] lobe1(넓은 로브)은 큰 명암 덩어리로 형태를 읽게 한다(저주파).
  • [B] lobe2(얇은 로브)은 가닥 느낌과 리듬을 만든다(고주파).
  • [B] 단일 로브만 쓰면 머리카락이 “코팅된 금속”처럼 보이기 쉬워, 두 로브로 역할을 분리하는 편이 안전하다.

심화: shift/power가 의미하는 것

  • [B] shift: 하이라이트 중심 위치를 이동시켜, 카메라 이동 시 밴드가 얼마나 “흘러가듯” 움직일지 결정한다.
  • [B] power: 로브 폭(샤프니스)을 결정한다. 값이 크면 얇아지고, 작으면 넓어진다.
  • [B] HDR 환경에서는 스펙이 bloom에 과하게 먹기 쉬워, 합성 후 clamp 또는 soft-knee를 같이 둔다.

코드 해설(로브 + flow)

  • [B] 아래는 “T(가닥 방향) + shift + power”로 간단한 이방성 로브를 만드는 형태다.
HLSL
half HairLobe(half3 T, half3 V, half3 L, half shift, half power)
{
    half3 H = normalize(V + L);
    half th = dot(normalize(T + shift * H), H);
    return pow(saturate(th * 0.5h + 0.5h), power);
}
HLSL
// Optional: flow map으로 방향을 보정 (flow: -1..1)
half2 flow = SAMPLE_TEXTURE2D(_HairFlowTex, sampler_HairFlowTex, uv).rg * 2.0h - 1.0h;
half3 Tflow = normalize(flow.x * T + flow.y * B);

half l1 = HairLobe(Tflow, V, L, _Lobe1Shift, _Lobe1Power);
half l2 = HairLobe(Tflow, V, L, _Lobe2Shift, _Lobe2Power);
half3 spec = _Lobe1Color.rgb * l1 + _Lobe2Color.rgb * l2;

// HDR/bloom 안전장치(예: 하이라이트 상한)
spec = min(spec, _SpecClamp.xxx);

URP 매핑 포인트

설계 해석

  • [B] 헤어 셰이더는 normal보다 tangent/bitangent 품질 검증이 우선이며 리깅 변경마다 회귀 테스트가 필요하다.

  • [B] 하이라이트 누적은 bloom 이전 단계에서 clamp를 걸어 HDR 과포화를 방지한다.

  • [B] tangent 품질과 flow map 좌표계 정합 필수

  • [B] HDR에서 하이라이트 클램프 테스트 필요

실패 패턴/오해

  • [B] 단일 로브만 사용해 금속광처럼 보임
  • [B] 탱전트 오염으로 밴드 떨림
  • [B] flow map이 sRGB로 들어가 방향이 왜곡됨(반드시 linear로 취급)
  • [B] 미러 UV/심(seam)에서 방향이 뒤집혀 하이라이트가 ‘끊김’처럼 보임

실무 체크리스트

Sources (섹션 단위 인용)