25. 중국 서브컬쳐 렌더링 기술 단위 분석 (Unity 6.3 / URP 17.3.0)
이 문서는 중국 서브컬쳐 스타일 렌더링을 "게임 단위"가 아니라 "기술 단위"로 해부합니다.
- 기준 시점: 2026-02-18
- 범위: 캐릭터 NPR + 배경/후처리 결합 + 멀티플랫폼 품질 운영
- 주의: 사내 구현이나 비공개 코드 추정은 배제하고, 공개 발표/커뮤니티 역분석에서 반복 확인되는 패턴만 채택
신규 대응 문서:
- 기술 택소노미:
book/30-subculture-technology-taxonomy.md - 기술별 상세:
book/35-tech-ramp-and-material-id-segmentation.md~book/46-tech-material-lut-and-parameter-packing.md - 교차 전이:
book/47-crossgame-pattern-transfer-matrix.md - 소스 레저:
book/48-subculture-source-ledger-2026.md
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 구현 골격:
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 핵심 규칙:
- 헤드 로컬 축 기준으로 광원 방향을 투영
- 좌/우 광원에 따라 UV 미러 샘플을 전환
- back light에서는 과도한 하이라이트를 차단
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: 얇은 선광택(가닥 느낌)
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 마스크나 버텍스 컬러로 부위별 라인 색 제어
실무 스택:
Inverted Hull로 기본 외곽선Depth/Normal Edge로 접촉부/내부 실루엣 보강- 마스크 기반 라인 색 교체
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 패턴:
- 캐릭터를 Rendering Layer 또는 stencil로 마스킹
- 씬 LUT 이후 캐릭터 전용 LUT/림/암부 리프트를 선택 적용
- 헤어/얼굴만 별도 강도 슬롯 제공
관련 계약:
DepthNormals가 없으면 screen-space rim/edge 품질 급락MotionVectors가 없으면 선택 보정 경계에서 고스팅 증가
25.9 Depth Rim + Screen-Space Edge (B+C)
깊이차를 이용한 림은 밝은 배경/역광에서 캐릭터 가독성을 유지하는데 효과적입니다.
핵심:
- view-space에서 normal offset 샘플 위치 계산
- 샘플 depth와 현재 depth 차이로 edge 계수 생성
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가 구현 복잡도 대비 안정적입니다.
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 계약 체크:
MotionVectorspass 포함- 하이라이트/림의 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 기준으로 최소 확인:
UniversalForwardShadowCasterDepthOnlyDepthNormals(SSAO/Outline/DepthRim 사용 시)MotionVectors(TAA/모션블러/리프로젝션 사용 시)- Deferred 프로젝트면
UniversalGBuffer
25.14 설계 시퀀스(권장)
- Face/Body/Hair 텍스처 채널 계약부터 고정
- Ramp + Material LUT로 기본 톤 분리
- Face SDF/Threshold 안정화
- Hair dual lobe + outline 색 구획
- Depth rim + selective grade 결합
- TAA/모션 환경에서 temporal 검증
- 플랫폼 tier별(모바일/PC/콘솔) 키워드 축소
25.15 참고 소스
공식(A):
- Wuthering Waves UE 인터뷰: https://www.unrealengine.com/en-US/developer-interviews/how-kuro-games-is-leveraging-unreal-engine-to-expand-wuthering-waves-to-ps5-and-ensure-a-high-quality-player-experience
- Infinity Nikki UE 인터뷰: https://www.unrealengine.com/pt-BR/developer-interviews/how-infiniti-engine-the-system-behind-infinity-nikki-brings-cozy-open-world-dress-up-adventure-to-life
- ZZZ Xbox Wire(DXR/HDR): https://news.xbox.com/en-us/2025/06/06/zenless-zone-zero-coming-to-xbox/
Zhihu/CSDN(B/C):
- 원신 캐릭터 셰이더 분석(램프/LightMap A): https://zhuanlan.zhihu.com/p/360229590
- 원신 URP 재현 분석: https://zhuanlan.zhihu.com/p/435005339
- ZZZ 역분석(다중 외곽선 색): https://zhuanlan.zhihu.com/p/620637822
- 명조 UFSH 정리: https://zhuanlan.zhihu.com/p/678876237
- 명조 캐릭터 효과 분석/재현: https://zhuanlan.zhihu.com/p/1949892894237389264
- HSR 재현(2-pass 캐릭터 아이디어): https://zhuanlan.zhihu.com/p/693831511
- UWA 카툰 렌더링 기술 정리: https://blog.csdn.net/UWA4D/article/details/73274993
- HSR URP 학습기: https://blog.csdn.net/2401_88809710/article/details/148908760
Baidu(D, 저신뢰):
- 바이지아하오/贴吧/知道는 기술 신호 대비 잡음 비율이 높아, 본문 설계의 주 근거로 채택하지 않음
- 상세 평가는
book/27-cn-subculture-rendering-source-notes.md참고