본문 바로가기

카테고리 없음

[Shader] Toon Shading

Vertex Shader

struct VS_INPUT  // 받아올 정보
{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
};

struct VS_OUTPUT // 버텍스 쉐이더한테 넘겨줄 정
{
   float4 mPosition : POSITION;
   float3 mDiffuse : TEXCOORD1;

};

float4x4 gWorldMatrix;         // 월드행렬
float4x4 gViewMatrix;          // 뷰행렬
float4x4 gProjectionMatrix;    // 투영행렬

float4 gWorldLightPosition;   // 빛의 위치
float4 gWorldCameraPosition;   // 카메라의 위치

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.mPosition = mul( Input.mPosition, gWorldMatrix );
       
   float3 lightDir = float3(Output.mPosition - gWorldLightPosition.xyz);
   lightDir = normalize(lightDir);
       
   Output.mPosition = mul( Output.mPosition, gViewMatrix );    
   Output.mPosition = mul( Output.mPosition, gProjectionMatrix );
   
   float3 normalWorld = mul(Input.mNormal, gWorldMatrix);
   normalWorld = normalize(normalWorld);
   
   Output.mDiffuse = dot(-lightDir, normalWorld);
   
   return Output;
}

Pixel Shader

struct PS_INPUT
{
   float3 mDiffuse : TEXCOORD1;

};
 
float4 ps_main(PS_INPUT Input) : COLOR
{
   float3 diffuse = saturate(Input.mDiffuse);
   diffuse = ceil(diffuse *5) / 5.0f;
   // 0~1 사이의값을 0.2, 0.4, 0.6, 0.8, 1.0 으로 만들어 빛이 한층한층생기도록 한다.
   return float4(diffuse, 1);
} 

출력 결과