// PhongPS // Pixel Shader (ps_4_0_level_9_1) // // Built with Odyssey Shader Generator v0.1.5045.27441 // 25/10/2013 14:55:42 //------------------------------------------------------------------------------ // Input/Output Structs //------------------------------------------------------------------------------ struct VSOut { float4 Position: SV_POSITION0; float4 WorldPosition: POSITION0; float3 Normal: NORMAL0; float2 TextureUV: TEXCOORD0; }; struct PSOut { float4 Color: SV_Target0; }; //------------------------------------------------------------------------------ // Custom Struct Definition //------------------------------------------------------------------------------ struct Material { float kA; float kD; float kS; float SpecularPower; float4 Ambient; float4 Diffuse; float4 Specular; }; struct PointLight { float Intensity; float Radius; float4 Diffuse; float3 Position; }; //------------------------------------------------------------------------------ // ConstantBuffers //------------------------------------------------------------------------------ cbuffer cbStatic : register(b0) { Material material; PointLight lPoint; }; cbuffer cbFrame : register(b1) { float3 vCameraPosition; }; //------------------------------------------------------------------------------ // Required methods //------------------------------------------------------------------------------ float4 PhongLighting(PointLight light, Material material, float3 vViewDirection, float3 vLightDirection, float3 vNormal) { float3 L = -normalize(vLightDirection); float3 V = normalize(vViewDirection); float3 N = normalize(vNormal); float NdotL = saturate(dot(N, L)); float fSelfShadow = saturate(4 * NdotL); float4 cDiffuse = material.kD * NdotL * material.Diffuse * light.Diffuse; float4 cAmbient = material.kA * material.Ambient; float3 R = reflect(-L, N); float RdotV = dot(R,V); float fSpecular = pow(max(RdotV, 0.0f), material.SpecularPower); float4 cSpecular = material.kS * fSpecular * material.Specular; float4 color = cAmbient + fSelfShadow *(cDiffuse + cSpecular); return color; } //------------------------------------------------------------------------------ // Pixel Shader //------------------------------------------------------------------------------ PSOut PhongPS(VSOut input) : SV_Target { float3 vWorldPos = input.WorldPosition.xyz; float3 vViewDirection = vCameraPosition - vWorldPos; float3 vLightDirection = vWorldPos - lPoint.Position; float4 cFinal = PhongLighting(lPoint, material, vViewDirection, vLightDirection, input.Normal); PSOut output; output.Color = cFinal; return output; }