January 26, 2010

Chinese Watercolor Shader Implementation (HLSL)

Tool : ATI Rendermonkey
Language: HLSL
First, I use 3D-Based edge detection. Basically, all I need is the dot production of view-to-vertex vector and the vertex normal. Then, if the dot production is bigger than x (x can be thought as the ink width or the angle between the normal and view vector), I draw black texture on it. If the dot production smaller than x, I draw another texture on it.
Key Code:

VS_OUTPUT vs_main( VS_INPUT Input)
   VS_OUTPUT Output;
   float3 Nrm = normalize(Input.Normal);
   float3 ViewVec = normalize(Input.Position - viewPos);
   Output.edge = dot(Nrm, ViewVec);
   Output.Position = mul( Input.Position, mul(mul(view,projection),world));
   Output.Normal = Nrm;
   return( Output );

float4 ps_main(float edge:TEXCOORD0, float3 N1: TEXCOORD1) : COLOR0

    float4 color; 
    float absV = abs(edge);
      float2 findColor = float2(absV*2.5f, N1.x/2.0f+N1.y/2.0f);
      color = tex2D(Texture1, findColor);
     float2 findColor = float2((1-absV)*1.666f, N1.x/2.0f+0.5f);
      color = tex2D(Texture0, 1-findColor);
   return color;
Here is another test: Ink Shading + Lambert Shading


0 意見: