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);
}
출력 결과