본문 바로가기

[ C/ C++ 프로그래밍 ]/[ Shader ]

카툰 렌더링



























ㅇGlow 카툰 세이더
float4x4 matWorldView;
float4x4 matWorldViewIT;
float4x4 matProjection;
float3 LightDir;

float4 diffuseColor;
float4 ambientColor;

float4 GlowColor;
float4 GlowAmbient;
float GlowThickness;

texture base;

sampler2D Texture0 = sampler_state
{
 texture = (base);
 minfilter = LINEAR;
 magfilter = LINEAR;
 mipfilter = LINEAR;
 addressu = wrap;
};

struct VS_INPUT
{
   float4 Position : POSITION0;
   float3 Normal : NORMAL;
   float2 TexCoord : TEXCOORD0;
};

struct VS_OUTPUT
{
   float4 Position : POSITION0;
   float4 Diffuse : COLOR0;
   float2 TexCoord : TEXCOORD0;
  
};
struct VS_INPUT01
{
   float4 Position : POSITION0;
   float3 Normal : NORMAL;
  
};

struct VS_OUTPUT01
{
   float4 Position : POSITION0;
   float4 Diffuse : COLOR0;
  
};


struct PS_OUTPUT {
   float4 Diffuse : COLOR;
   float2 TexCoord : TEXCOORD0;
};

struct PS_INPUT01
{
   float4 Position : POSITION0;
   float4 Diffuse : COLOR0;
  
};


VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
   float3 L = normalize(LightDir);
   float3 P = mul(Input.Position, matWorldView);
   float3 N = normalize(mul(Input.Normal, (float3x3)matWorldViewIT));  //Normal Vector is 3x3 --> dp3
  
   Output.Position= mul(float4(P, 1), matProjection);
   Output.Diffuse = max(0, dot(N,L));
   Output.TexCoord = Input.TexCoord;
  
    
   return( Output );
  
}

float4 ps_main(VS_OUTPUT Input) : COLOR0
{
  return( tex2D(Texture0, Input.TexCoord) );
}


VS_OUTPUT01 vs_main01( VS_INPUT01 Input01 )
{
   VS_OUTPUT01 Output01;
  
   //Normal (view space)
   float3 N = normalize( mul ( Input01.Normal, (float3x3)matWorldViewIT ) );
  
   // Displaced postion(view space)
   float3 P = mul(Input01.Position, matWorldView ) +  GlowThickness * N;
  
   //glow axis
   float3 A = float3(0,0,1);
   float Power;
   Power = dot(N, A);
   Power *= Power;
   Power -=1;
   Power *= Power;
   //Power *= Power; //pwoer =(1 - (N dot A)^2)^2 = ((N dot A)^2 -1)^2
  
   // Projected positsdwino
   Output01.Position = mul(float4(P,1), matProjection);
   Output01.Diffuse = GlowColor * Power +GlowAmbient;  
  
  return( Output01 );
}

float4 ps_main01(VS_OUTPUT01 Input) : COLOR0
{  

  float4 color = Input.Diffuse;
  return color;
}

 

//Technique
technique TSader
{
    pass P0
    {
        VertexShader = compile vs_2_0 vs_main01();
        PixelShader  = compile ps_2_0 ps_main01();
   }
    pass P1
    {
        VertexShader = compile vs_2_0 vs_main();
        PixelShader  = compile ps_2_0 ps_main();
       
  Texture[0] = base;
        MinFilter[0] = LINEAR;
        MagFilter[0] = LINEAR;
        MipFilter[0] = LINEAR;
    }   
   
}



ㅇ 실행 결과  ==> Glow 카툰




'[ C/ C++ 프로그래밍 ] > [ Shader ]' 카테고리의 다른 글

퐁세이딩  (1) 2010.07.08
VC++ 2008에서 쉐이더 코드를 C++ 코드처럼  (0) 2010.07.07
Glow 효과  (1) 2010.07.07
[HLSL] 블린- 퐁 반영 반사광  (2) 2010.06.02
[HLSL] 퐁 반영 반사광 (반사벡터)  (2) 2010.06.02