"매 Okami Ink Wash는 매 Japanese sumi-e (墨絵) 의 매 real-time game rendering 의 매 translation". 매 Clover Studio 2006 의 매 hand-painted brush stroke + 매 watercolor bleed + 매 calligraphic outline 의 매 NPR pipeline — 매 modern stylized rendering 의 매 foundational reference.
매 핵심
매 Visual Components
Outline (calligraphic): 매 view-space normal/depth edge detection + 매 brush-tip texture 의 매 sweep along edge.
Cel-shaded fill: 매 매 2-3 tone toon shader, 매 hard band transition.
Paper texture: 매 background canvas (washi paper) 의 매 multiplicative overlay.
Ink bleed: 매 매 alpha-mask 의 매 noise-perturbed edge — 매 ink-on-paper 의 매 organic boundary.
Color desaturation: 매 매 muted ochre/red/black palette — 매 sumi-e 의 매 traditional ink color.
매 Rendering Pipeline
Geometry pass (forward).
Outline pass (post-process: depth + normal Sobel → brush-stroke compositor).
Toon shading (vertex normal · light direction → step function).
Paper overlay (full-screen quad multiply).
Ink-bleed mask (procedural noise on alpha).
매 응용
Okami / Okamiden (Clover, Capcom).
Sumire / Genji (homage).
Modern: Sable, Kena: Bridge of Spirits (related NPR styles).
💻 패턴
Sobel-based outline detection (post-process)
// HLSL — sample depth in 3x3 kernel, apply SobelfloatSampleDepth(float2uv){return_DepthTex.SampleLevel(s,uv,0).r;}float4OutlinePass(float2uv:TEXCOORD0):SV_Target{float2px=_ScreenSize.zw;floatgx=-SampleDepth(uv+float2(-px.x,-px.y))-2*SampleDepth(uv+float2(-px.x,0))-SampleDepth(uv+float2(-px.x,px.y))+SampleDepth(uv+float2(px.x,-px.y))+2*SampleDepth(uv+float2(px.x,0))+SampleDepth(uv+float2(px.x,px.y));floatgy=-SampleDepth(uv+float2(-px.x,-px.y))-2*SampleDepth(uv+float2(0,-px.y))-SampleDepth(uv+float2(px.x,-px.y))+SampleDepth(uv+float2(-px.x,px.y))+2*SampleDepth(uv+float2(0,px.y))+SampleDepth(uv+float2(px.x,px.y));floatedge=saturate(sqrt(gx*gx+gy*gy)*50);floatbrush=_BrushTex.Sample(s,uv*4+Hash(uv)*0.05).r;returnfloat4(0,0,0,edge*brush);}
// Full-screen post-process — multiplicative paper grainfloat4PaperOverlay(float2uv:TEXCOORD0):SV_Target{float4scene=_SceneTex.Sample(s,uv);floatpaper=_PaperTex.Sample(s,uv*_PaperScale).r;// Slightly desaturate scene for ink-wash feelfloatgray=dot(scene.rgb,float3(0.299,0.587,0.114));scene.rgb=lerp(float3(gray,gray,gray),scene.rgb,0.85);returnfloat4(scene.rgb*(0.7+paper*0.3),1.0);}
Ink-bleed alpha noise
// Animate bleed boundary using simplex noisefloatinkBleed(vec2uv,floatt){floatn=simplex(uv*12.0+vec2(t*0.1));returnsmoothstep(0.45,0.55,n);}voidmain(){vec4base=texture(uInk,vUV);floatbleed=inkBleed(vUV,uTime);fragColor=vec4(base.rgb,base.a*bleed);}
Brush-stroke trail (Celestial Brush mechanic)
// Player draws a stroke; sample points become ribbon mesh
classBrushStroke{points:{pos: Vec2;pressure: number;t: number}[]=[];add(p: Vec2,pressure: number){this.points.push({pos: p,pressure,t: performance.now()});}toRibbonMesh():Mesh{returngenerateRibbon(this.points,p=>p.pressure*8.0);// Width tapers based on pressure; texture is brush-tip
}}
Color palette (muted ochre/red/black)
// LUT-based color grading toward sumi-e palettefloat3ApplyOkamiLUT(float3color){// Lookup table mapping linear color -> sumi-e palettereturn_OkamiLUT.Sample(s,color).rgb;}
매 결정 기준
상황
Approach
Stylized NPR action game
매 Okami pipeline (outline + cel + paper) 의 매 baseline
Performance-constrained mobile
매 vertex-based outline (vs post-process)
Player-authored brush mechanic
매 ribbon-mesh + 매 spline tessellation
Color grading
매 muted palette LUT, 매 desaturate 80-90%
기본값: 매 view-space outline + 매 3-band toon + 매 paper overlay + 매 sumi-e LUT — 매 Okami canonical NPR stack.
언제: 매 NPR shader design, 매 sumi-e/ink-wash style 의 매 implementation, 매 outline-detection algorithms.
언제 X: 매 photo-realistic rendering (매 stylization 의 매 mismatch).
🪲 안티패턴
Pure post-process outline: 매 매 thin geometry 의 매 outline miss — 매 vertex-based hybrid 권장.
Constant brush thickness: 매 매 calligraphic feel 의 매 lose — 매 pressure/curvature 의 매 width modulate.
Over-saturated palette: 매 sumi-e 의 매 muted feel 의 매 contradict.
🧪 검증 / 중복
Verified (Clover Studio Okami GDC 2007 talk, Capcom dev blogs, modern NPR research papers e.g. "Stylized Rendering" SIGGRAPH 2018).