28. 서브컬쳐 렌더링 심화 시리즈 허브
이 시리즈는 “애니메이션 스타일(NPR/서브컬쳐) 렌더링”을 룩(아트) 설명으로 끝내지 않고, Unity 6 + URP에서 재현 가능한 계약(데이터/패스/시간축) 으로 환원해 정리합니다. [B]
- [B] 목표: “예쁜 결과”가 아니라 “재현 가능한 시스템(원인-결과가 고정되는 셰이더/파이프라인)”을 만든다.
- [B] 방식: 4개 핵심 게임(명조/소녀전선2/엔드필드/ZZZ)은 패턴 추출용으로만 다루고, 구현 결론은 기술 문서(35~46)로 수렴시킨다.
- [A/B] 원칙: 내부 구현 단정 금지. 공개 근거(OFF)와 재현 가능한 역분석(B)만으로 문장을 확정한다.
기준 시점: 2026-02-18
목적
- [A] 기존 23~27장을 유지한 채, 28~48 독립 시리즈를 제공한다.
- [A/B] 게임 분석과 기술 분석을 분리해 탐색 경로를 단순화한다.
증거 등급 요약(A/B/C)
A: 공식 발표/공식 공지/공식 인터뷰B: 코드/캡처/재현이 있는 기술 역분석C: 관찰/학습기/가설
핵심 개념
- [A] 문서 구조:
허브 -> 프로토콜 -> 택소노미 -> 게임(4) -> 기술(12) -> 매트릭스 -> 소스 레저 - [B] 중심 타이틀: 명조, 소녀전선2: 추방, 명일방주: 엔드필드, 젠레스 존 제로
서론: 왜 28~48을 별도 시리즈로 분리했나
- [B] 서브컬쳐 렌더링은 “효과가 많다”가 아니라, 효과 간 계약이 얽혀 있어 하나만 붙이면 다른 곳이 깨지는 일이 반복된다.
- [B] 특히 아래 3가지가 고정되지 않으면 같은 셰이더라도 결과가 매번 달라진다.
- [B] 채널 계약: 마스크/ID/FaceSDF/flow/LUT 채널 의미가 캐릭터마다 바뀌어 디버깅이 불가능해진다.
- [A/B] 패스 계약:
DepthNormals/MotionVectors누락, 또는 적용 위치(post 전/후) 혼동으로 시간축/라인이 붕괴한다. - [A/B] 시간축 계약: hard step과 얇은 라인은 히스토리(TAA/리프로젝션) 오염에 특히 취약하다.
개론: “룩을 만드는 최소 단위”는 기술(T-ID)이다
- [A/B] 이 시리즈는 “게임 이름”이 아니라 “기술 단위(T-ID)”를 최소 단위로 본다.
- [B] T-ID 하나는
입력 데이터(텍스처/버퍼) + 셰이더 함수 + 적용 패스 위치를 함께 가진다. - [B] 그래서 31~34(게임 문서)은 관찰을 모으는 문서이고, 실제 구현은 35~46(기술 문서)에서 닫힌다.
본론: 읽는 순서(역할별 추천)
- [A/B] 렌더링/파이프라인 엔지니어: 29 -> 30 -> 45 -> 43 -> 44 -> 47
- [B] 캐릭터 셰이더 담당: 30 -> 35 -> 36 -> 37 -> 38 -> 40 -> 46 -> 43
- [B] 테크 아티스트/아트 파이프라인: 29 -> 30 -> 35 -> 46 -> 41 -> 48
결론: 이 시리즈를 끝내면 남아야 하는 산출물
- [B] 캐릭터용 URP 셰이더에서 “얼굴/헤어/외곽선/시간축”이 서로 충돌하지 않는 기본 계약 세트
- [B] 새 캐릭터 투입 시 “채널 계약 + T-ID 체크리스트”로 빠르게 품질을 맞추는 운영 루틴
- [A/B] 48장 레저를 갱신하며 문장 근거를 유지하는 업데이트 프로토콜
문서 인덱스
- 29. 리서치 프로토콜
- 30. 기술 택소노미
- 31. 명조 심화
- 32. 소녀전선2 심화
- 33. 엔드필드 심화
- 34. ZZZ 심화
- 35~46. 기술 문서
- 47. 전이 매트릭스
- 48. 소스 레저
URP 매핑 포인트
- [A] 계약 기준 문서: 18장, 20장
- [A/B] 기술 문서는 HLSL 함수 계층 + RendererFeature 계층을 함께 다룬다.
- [B] 실전 구현은 “추가 효과”보다 “계약 고정”을 우선한다.
- [B] 1) 셰이더에서 T001~T005(조명 전달/데이터 계약)를 먼저 고정
- [A/B] 2) RendererFeature로 T006~T010(외곽선/선택 보정/엣지)을 고정
- [A/B] 3) 마지막에 T012~T013(temporal/파이프라인)을 묶어서 안정화
실패 패턴/오해
- [B] 역분석 결과를 원본 구현으로 단정하는 오류.
- [A] MotionVectors/DepthNormals 계약 없이 temporal/edge를 먼저 붙이는 오류.