// This is C2E2f_passthru from "The Cg Tutorial" (Addison-Wesley, ISBN // 0321194969) by Randima Fernando and Mark J. Kilgard. See page 53. struct fregm_Output { float4 color : COLOR; }; fregm_Output fregm_shader( float2 texCoord : TEXCOORD0, float4 position : TEXCOORD1, float3 normal : TEXCOORD2, float4 color : COLOR, uniform float3 globalAmbient, uniform float3 lightColor, uniform float3 lightPosition, uniform float3 eyePosition, uniform float3 Ke, uniform float3 Ka, uniform float3 Kd, uniform float3 Ks, uniform float shininess) { fregm_Output OUT; float3 P = position.xyz; float3 N = normalize(normal); // Compute the emissive term float3 emissive = Ke; // Compute the ambient term float3 ambient = Ka * globalAmbient; // Compute the diffuse term float3 L = normalize(lightPosition - P); float diffuseLight = max(dot(N, L), 0); float3 diffuse = Kd * lightColor * diffuseLight; // Compute the specular term float3 V = normalize(eyePosition - P); float3 H = normalize(L + V); float specularLight = pow(max(dot(N, H), 0), shininess); if (diffuseLight <= 0) specularLight = 0; // float3 specular = Ks * lightColor * specularLight; float3 specular = Ks * specularLight; OUT.color.xyz = emissive + ambient + diffuse + specular; OUT.color.w = 1.0; return OUT; }