<Vertex Shader>
float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;
float4 gWorldLightPosition; // World 상의 Light의 위치(위치는 곧 방향) //
float4 gWorldCameraPosition; // World 상의 Camera의 위치(위치는 곧 방향) //
struct VS_INPUT
{
float4 mPosition : POSITION;
float3 mNormal : NORMAL; // Vertex Shader에서 난반사를 표현하기 위해 Normal정보를 받는다 //
};
struct VS_OUTPUT
{
float4 mPosition : POSITION;
float3 mDiffuse : TEXCOORD1;
float3 mViewDir : TEXCOORD2;
float3 mReflection : TEXCOORD3;
};
VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output;
Output.mPosition = mul(Input.mPosition, gWorldMatrix);
// Vertex에서 보는 Light의 방향 //
float3 lightDir = Output.mPosition.xyz - gWorldLightPosition.xyz; // Light에서 Vertex방향으로 향함 //
lightDir = normalize(lightDir); // 정규화 //
// Vertex에서 보는 Light의 방향 //
float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
Output.mViewDir = viewDir;
// Normal을 World 공간으로 이동 //
float3 worldNormal = mul(Input.mNormal, (float3x3)gWorldMatrix);
worldNormal = normalize(worldNormal);
Output.mPosition = mul(Output.mPosition, gViewMatrix);
Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
// dot은 실수 하나 이지만 float3에 넣으면 같은 성분으로 모두 채워짐 //
// -lightDir : Vertex에서 Light를 보는 방향을 변경 //
Output.mDiffuse = dot(-lightDir, worldNormal);
Output.mReflection = reflect(lightDir, worldNormal);
return Output;
}
<Pixel Shader>
struct PS_INPUT
{
float3 mDiffuse : TEXCOORD1; // Vertex Shader에서 받아온 난반사광 //
float3 mViewDir : TEXCOORD2;
float3 mReflection : TEXCOORD3;
};
float4 ps_main(PS_INPUT Input) : COLOR
{
// saturate : 0이하는 0, 1이상은 1로 만들어줌 //
// dot은 -1까지 나오니 saturate 사용하자 //
float3 diffuse = saturate(Input.mDiffuse);
//normalize 되어 있지만 보간을 거치면서 값이 흐틀러질 수 있음 //
float3 reflection = normalize(Input.mReflection);
float3 viewDir = normalize(Input.mViewDir);
float3 specular = 0;
if (diffuse.x > 0) // 값이 모두 같으므로 0이하는 어둠이기에 생략 //
{
specular = saturate(dot(reflection, -viewDir)); // 스페큘러도 0~1 안으로 설정 //
specular = pow(specular, 20.0f); // pow 거듭제곱 (pow로 스페큘러값을 조절 할 수 있음) //
}
float3 ambient = float3(0.1f, 0.1f, 0.1f); // 환경광을 넣음 //
return float4(ambient + diffuse + specular, 1); // float3를 float4로 변경 //
//(합이 1이 넘어도 알아서 1이됨) //
}
'Shader > HLSH Shader 공부' 카테고리의 다른 글
Lighting (0) | 2014.05.22 |
---|---|
TextureMapping (0) | 2014.05.22 |
Color (0) | 2014.05.15 |