book/25-cn-subculture-rendering-tech-units.md

25. 중국 서브컬쳐 렌더링 기술 단위 분석

Zhihu/CSDN/Baidu 조사와 공개 기술 발표를 합쳐, 카툰/서브컬쳐 렌더링을 기술 단위로 분해하고 URP 17.3.0 구현 계약까지 연결한다

25. 중국 서브컬쳐 렌더링 기술 단위 분석 (Unity 6.3 / URP 17.3.0)

이 문서는 중국 서브컬쳐 스타일 렌더링을 "게임 단위"가 아니라 "기술 단위"로 해부합니다.

  • 기준 시점: 2026-02-18
  • 범위: 캐릭터 NPR + 배경/후처리 결합 + 멀티플랫폼 품질 운영
  • 주의: 사내 구현이나 비공개 코드 추정은 배제하고, 공개 발표/커뮤니티 역분석에서 반복 확인되는 패턴만 채택

신규 대응 문서:

25.1 증거 등급(신뢰도)

등급 의미 문서 내 표기
A 공식 발표/공식 인터뷰/공식 공지 A
B 프레임 캡처 + 셰이더 역분석 + 재현 코드가 함께 있는 커뮤니티 글 B
C 재현 튜토리얼/학습기 (근거 일부만 제시) C
D 포털 잡음/광고성/AI 생성 텍스트 중심 D

실무에서는 A+B를 우선 채택하고, C는 아이디어 참고로만 사용합니다. D는 문서 본문 설계 근거로 쓰지 않습니다.

25.2 서브컬쳐 셰이더 기술 맵

기술 단위 왜 중요한가 URP 연결 지점
Ramp Diffuse + 재질 구획 마스크 큰 명암 덩어리와 재질 분리감을 동시에 만듦 UniversalForward/UniversalGBuffer
Face SDF/Threshold 얼굴 명암의 "의도 고정" 전용 face pass 또는 body pass 내 분기
Hair Dual Lobe 머리카락 가닥 방향성과 광택 리듬 tangent 기반 spec 함수
Multi-Color Outline 2D풍 라인 아트 인상 Inverted hull + screen-space edge
Material LUT 부위별 spec/rim 파라미터 압축 LUT 샘플 + LightMap/ID 연계
Character Local Light 배경 대비 캐릭터 가독성 확보 Rendering Layer/stencil + selective grade
Depth Rim 실루엣 읽기 강화 depth 샘플 + screen-space 폭 제어
OIT/장식 재질 헤어카드/레이스/보석 안정성 반투명 누적 pass(RenderGraph)
Temporal 안정화 TAA/모션블러에서 플리커 억제 MotionVectors, DepthNormals
Hybrid 렌더링 구조 모바일~콘솔 품질/성능 균형 Forward/Deferred 혼합 운영

25.3 Ramp Diffuse + 재질 구획 마스크 (A+B)

관찰되는 공통점:

  • 램프 텍스처를 단순 명암 그라데이션이 아니라 "재질별 색띠"로 사용
  • LightMap/Mask의 특정 채널(특히 A)로 재질 구획을 선택
  • 낮/밤(웜/쿨) 변형을 램프 행(row) 또는 LUT 축으로 분리

URP 구현 골격:

HLSL
half matClass = SAMPLE_TEXTURE2D(_LightMap, sampler_LightMap, uv).a; // 0..1
half ndl = saturate(dot(N, L));
half halfLambert = ndl * 0.5h + 0.5h;

// 8개 재질 구획 예시
half row = floor(matClass * 7.999h);           // 0..7
half y = (row + 0.5h) * (1.0h / 8.0h);         // row center
half x = saturate(halfLambert * _RampScale + _RampBias);
half3 rampColor = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, half2(x, y)).rgb;

포인트:

  • x 샘플은 우측 끝 아티팩트(검은선) 방지를 위해 clamp/margin 처리
  • 얼굴/피부/금속/천 등 "재질 의미"를 텍스처 채널 계약으로 고정

25.4 Face SDF/Threshold Map (A+B)

얼굴은 일반 NPR에서 가장 자주 깨지는 영역입니다. 많은 사례에서 얼굴은 별도 임계값 맵(또는 SDF)으로 제어됩니다.

URP 핵심 규칙:

  1. 헤드 로컬 축 기준으로 광원 방향을 투영
  2. 좌/우 광원에 따라 UV 미러 샘플을 전환
  3. back light에서는 과도한 하이라이트를 차단
HLSL
half faceMaskR = SAMPLE_TEXTURE2D(_FaceShadowTex, sampler_FaceShadowTex, uv).r;
half faceMaskL = SAMPLE_TEXTURE2D(_FaceShadowTex, sampler_FaceShadowTex, half2(1.0h - uv.x, uv.y)).r;

half side = dot(lightDirWS, headRightWS);
half mask = (side >= 0.0h) ? faceMaskR : faceMaskL;

half front = dot(lightDirWS, headForwardWS);
half threshold = saturate(_FaceBias + _FaceFrontScale * front + _FaceSideScale * abs(side));
half faceLit = step(threshold, mask);

25.5 Hair Dual Lobe + Aniso Direction (B)

중국 서브컬쳐 캐릭터에서 머리카락은 보통 "넓은 로브 + 얇은 로브" 2개를 겹칩니다.

  • 로브 1: 큰 광택 덩어리(형태 읽기)
  • 로브 2: 얇은 선광택(가닥 느낌)
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);
}

운영 팁:

  • 탱전트 품질이 낮으면 로브 튐이 먼저 발생
  • 노말 보정과 탱전트 보정은 같은 좌표계에서 수행

25.6 Multi-Color Outline (B)

최근 스타일(특히 ZZZ 계열 역분석 글)에서 많이 보이는 패턴:

  • 외곽선 색을 1개가 아니라 3~5개 구획으로 분리
  • ID 마스크나 버텍스 컬러로 부위별 라인 색 제어

실무 스택:

  1. Inverted Hull로 기본 외곽선
  2. Depth/Normal Edge로 접촉부/내부 실루엣 보강
  3. 마스크 기반 라인 색 교체
HLSL
half id = SAMPLE_TEXTURE2D(_OutlineMask, sampler_OutlineMask, uv).r;
half3 lineColor = _LineColor0.rgb;
lineColor = (id < 0.8h) ? _LineColor1.rgb : lineColor;
lineColor = (id < 0.6h) ? _LineColor2.rgb : lineColor;
lineColor = (id < 0.4h) ? _LineColor3.rgb : lineColor;

25.7 Material LUT 압축 (B+C)

8x8 또는 소형 LUT 한 장에 부위별 파라미터를 몰아넣는 방식이 자주 등장합니다.

  • spec color/intensity/roughness
  • rim width/color
  • 특수 파라미터(예: 발광 임계값)

장점:

  • 머티리얼 파라미터 수를 줄여 아트 파이프라인 단순화
  • 부위별 룩 통일성 유지

25.8 Character Local Lighting + Selective Grade (A+B)

배경이 복잡한 대형 월드에서도 캐릭터를 읽히게 하려면, 캐릭터 전용 보정을 분리해야 합니다.

URP 패턴:

  1. 캐릭터를 Rendering Layer 또는 stencil로 마스킹
  2. 씬 LUT 이후 캐릭터 전용 LUT/림/암부 리프트를 선택 적용
  3. 헤어/얼굴만 별도 강도 슬롯 제공

관련 계약:

  • DepthNormals가 없으면 screen-space rim/edge 품질 급락
  • MotionVectors가 없으면 선택 보정 경계에서 고스팅 증가

25.9 Depth Rim + Screen-Space Edge (B+C)

깊이차를 이용한 림은 밝은 배경/역광에서 캐릭터 가독성을 유지하는데 효과적입니다.

핵심:

  • view-space에서 normal offset 샘플 위치 계산
  • 샘플 depth와 현재 depth 차이로 edge 계수 생성
HLSL
half scene = LinearEyeDepth(SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, uv).r, _ZBufferParams);
half self = i.positionVS.z;
half edge = saturate((scene - self - _DepthRimBias) * _DepthRimScale);

25.10 투명/장식 재질: OIT + 가짜 굴절 (A+B)

관찰되는 공통 패턴:

  • 의상 레이스/머리카드/주얼리에서 정렬 문제를 줄이기 위해 OIT 계열 전략 사용
  • 보석은 큐브맵 + 프레넬 + 얕은 굴절 offset 샘플 조합

URP에서는 Weighted Blended OIT가 구현 복잡도 대비 안정적입니다.

HLSL
accum.rgb += src.rgb * src.a * w;
accum.a   += src.a * w;
final.rgb = accum.rgb / max(accum.a, 1e-4);

25.11 Temporal 안정화 (A+B)

중국 최신 서브컬쳐 타이틀에서 공통으로 강조되는 이슈가 시간축 안정성입니다.

  • TAA/TAAU 사용 시 얇은 라인/하이라이트가 번지기 쉬움
  • 해결 핵심은 velocity + 임계값 완화 + 샘플 안정화

URP 계약 체크:

  • MotionVectors pass 포함
  • 하이라이트/림의 hard step 값을 너무 극단적으로 두지 않음
  • 디더/노이즈는 frame-stable 패턴 사용

25.12 Hybrid 렌더링 구조 (A)

대형 프로젝트에서는 보통 아래 구조가 반복됩니다.

  • Opaque 대다수: Deferred 또는 one-pass defer 계열
  • 캐릭터/투명/특수: Forward
  • 후처리: TAAU/SSR/GTAO/색보정

이 방식은 "광원/재질 수 증가"와 "캐릭터 NPR 제어"를 동시에 만족하기 쉽습니다.

25.13 URP 통합 체크리스트(필수 계약)

book/20-urp-pass-tags-and-lightmode-contract.md 기준으로 최소 확인:

  • UniversalForward
  • ShadowCaster
  • DepthOnly
  • DepthNormals (SSAO/Outline/DepthRim 사용 시)
  • MotionVectors (TAA/모션블러/리프로젝션 사용 시)
  • Deferred 프로젝트면 UniversalGBuffer

25.14 설계 시퀀스(권장)

  1. Face/Body/Hair 텍스처 채널 계약부터 고정
  2. Ramp + Material LUT로 기본 톤 분리
  3. Face SDF/Threshold 안정화
  4. Hair dual lobe + outline 색 구획
  5. Depth rim + selective grade 결합
  6. TAA/모션 환경에서 temporal 검증
  7. 플랫폼 tier별(모바일/PC/콘솔) 키워드 축소

25.15 참고 소스

공식(A):

Zhihu/CSDN(B/C):

Baidu(D, 저신뢰):