// final pixel output: // data from pixel shader to frame buffer struct vertexOut { float4 HPosition : POSITION; float4 TexCoord : TEXCOORD0; float3 LightVec : TEXCOORD1; float3 WorldNormal : TEXCOORD2; float3 WorldPos : TEXCOORD3; float3 WorldView : TEXCOORD4; }; struct pixelOut { float4 col : COLOR; }; // pixel shader pixelOut main(vertexOut IN // input from vertex shade //uniform float SpecExpon, // constant parameters fro //uniform float4 AmbiColor, // application //uniform float4 SurfColor, //uniform float4 LightColor ) { float SpecExpon = 120; float4 LightColor = { 1, 1, 1, 1 }; pixelOut OUT; // output of the pixel shader float3 Ln = normalize(IN.LightVec); float3 Nn = normalize(IN.WorldNormal); float3 Vn = normalize(IN.WorldView); float3 Hn = normalize(Vn + Ln); // scalar product between light and normal vectors: float ldn = dot(Ln,Nn); // scalar product between halfway and normal vectors: float hdn = dot(Hn,Nn); // specialized "lit" function computes weights for // diffuse and specular parts: float4 litV = lit(ldn,hdn,SpecExpon); float4 diffContrib = glstate.material.diffuse * ( litV.y * LightColor + glstate.lightmodel.ambient); float4 specContrib = litV.y*litV.z * LightColor; // sum of diffuse and specular contributions: float4 result = diffContrib + specContrib; OUT.col = result; return OUT; // output of pixel shader }