/**
|
* Calculates the specular intensity of reflected light.
|
*
|
* @name czm_getSpecular
|
* @glslFunction
|
*
|
* @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates.
|
* @param {vec3} toEyeEC Unit vector pointing to the eye position in eye coordinates.
|
* @param {vec3} normalEC The surface normal in eye coordinates.
|
* @param {float} shininess The sharpness of the specular reflection. Higher values create a smaller, more focused specular highlight.
|
*
|
* @returns {float} The intensity of the specular highlight.
|
*
|
* @see czm_phong
|
*
|
* @example
|
* float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC);
|
* float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200);
|
* vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity);
|
*/
|
float czm_getSpecular(vec3 lightDirectionEC, vec3 toEyeEC, vec3 normalEC, float shininess)
|
{
|
vec3 toReflectedLight = reflect(-lightDirectionEC, normalEC);
|
float specular = max(dot(toReflectedLight, toEyeEC), 0.0);
|
|
// pow has undefined behavior if both parameters <= 0.
|
// Prevent this by making sure shininess is at least czm_epsilon2.
|
return pow(specular, max(shininess, czm_epsilon2));
|
}
|