"매 3D model 을 매 2D anime 처럼 보이게 매 render — 매 artist control 이 매 algorithm 보다 매 우선.". Arc System Works (Junya C. Motomura, GDC 2014) 의 매 Xrd 파이프라인은 매 NPR (non-photorealistic rendering) 의 매 landmark. 매 hand-painted normal + custom shadow + ink line + post-processing 의 매 stack.
매 핵심
매 Pipeline stage
Modeling: 매 low-poly model + 매 hand-tuned vertex normal.
Base color shading: 매 ramp texture (1D LUT) — 매 toon step.
Custom shadow direction: 매 light vector 무시 + 매 artist 가 매 manual paint.
Outline (ink line): 매 inverted hull / 매 post-process edge.
Specular & rim: 매 hand-placed highlight texture.
Post-processing: 매 chromatic aberration, 매 bloom, 매 color grading.
매 Vertex normal trick
매 face 의 매 normal 을 매 sphere 로 매 매뉴얼 average — 매 2D 에서 매 깔끔한 shadow shape.
매 hair 는 매 normal 을 매 head 의 매 center 로 매 향하게 — 매 anisotropic specular 의 매 illusion.
매 Ramp texture
1D texture, 매 N·L → matrix lookup. 매 step 2-3 단계 — 매 hard edge.
매 character 별 매 다른 ramp — 매 다른 mood.
매 Outline
Backface inverted hull: 매 model 을 매 normal 방향 outward extrude + cull front. 매 cheap, 매 thickness 균일.
Vertex color mask: 매 detail line 의 매 thickness 제어.
매 응용
Anime fighting game (Dragon Ball FighterZ, Granblue Versus 도 매 변형).
// Vertex pass — render with cull = Frontfloat3normalWS=TransformObjectToWorldNormal(IN.normal);float3posWS=TransformObjectToWorld(IN.positionOS)+normalWS*_OutlineWidth;OUT.positionCS=TransformWorldToHClip(posWS);OUT.color=_OutlineColor;
Custom shadow direction (face)
// Replace light dir with artist-specified vector for facefloat3fixedLight=mul((float3x3)unity_ObjectToWorld,_FaceLightDir);floatNdotL=dot(worldNormal,normalize(fixedLight));
Hair tangent trick
// Hair anisotropic — tangent points along hair flowfloat3H=normalize(viewDir+lightDir);floatTdotH=dot(hairTangent,H);floatspec=pow(1.0-TdotH*TdotH,_HairGloss);
importnumpyasnpfromPILimportImageramp=np.zeros((1,256,3),dtype=np.uint8)ramp[0,:64]=(60,50,80)# deep shadowramp[0,64:160]=(140,130,150)# midramp[0,160:]=(250,245,240)# litImage.fromarray(ramp).save('toon_ramp.png')
Specular hand-placed mask
// Per-pixel mask painted by artist — multiplies specfloatspecMask=tex2D(_SpecMaskTex,uv).r;float3spec=pow(saturate(dot(N,H)),_Power)*specMask*_SpecColor;
매 결정 기준
효과
Approach
매 hard cel shadow
Ramp 1D texture + step
매 face shadow control
Custom light vector
매 cheap outline
Inverted hull (backface)
매 detail outline
Post-process Sobel on N+depth
매 anime hair
Tangent-based aniso + ramp
매 emotional rim
Hand-placed highlight mask
기본값: ramp + inverted hull + face light override. 매 modern (Unreal/Unity) 모두 매 stable.