// This is C5E3f_basicLight from "The Cg Tutorial" (Addison-Wesley, ISBN // 0321194969) by Randima Fernando and Mark J. Kilgard. See page 125. float3 expand(float3 v) { return (v-0.5)*2; // Expand a range-compressed vector } void C5E3f_basicLight(float4 position : TEXCOORD0, float3 normal : TEXCOORD1, float3 H : TEXCOORD2, float3 N : TEXCOORD3, float diffuseLight : TEXCOORD4, float lightColor : TEXCOORD5, float2 texCoord : TEXCOORD6, float2 normalMapTexCoord : TEXCOORD0, float3 lightDir : TEXCOORD7, float4 color2 : COLOR, out float3 color : COLOR, uniform float3 Ks, uniform float shininess, uniform sampler2D normalMap, uniform samplerCUBE normalizeCube, uniform sampler2D decal : TEX0) { // Compute the specular term float specularLight = pow(max(dot(H, N), 0), shininess); if (diffuseLight <= 0) specularLight = 0; float3 specular = Ks * lightColor * specularLight; float3 lightTex = texCUBE(normalizeCube, lightDir).xyz; float3 light = expand(lightTex); // Sample and expand the normal map texture float3 normalTex = tex2D(normalMap, normalMapTexCoord).xyz; float3 n = expand(normalTex); // Diffuse lighting color = dot(n,light) + tex2D(decal,texCoord) + specular; }