float czm_private_getLambertDiffuseOfMaterial(vec3 lightDirectionEC, czm_material material)
|
{
|
return czm_getLambertDiffuse(lightDirectionEC, material.normal);
|
}
|
|
float czm_private_getSpecularOfMaterial(vec3 lightDirectionEC, vec3 toEyeEC, czm_material material)
|
{
|
return czm_getSpecular(lightDirectionEC, toEyeEC, material.normal, material.shininess);
|
}
|
|
/**
|
* Computes a color using the Phong lighting model.
|
*
|
* @name czm_phong
|
* @glslFunction
|
*
|
* @param {vec3} toEye A normalized vector from the fragment to the eye in eye coordinates.
|
* @param {czm_material} material The fragment's material.
|
*
|
* @returns {vec4} The computed color.
|
*
|
* @example
|
* vec3 positionToEyeEC = // ...
|
* czm_material material = // ...
|
* vec3 lightDirectionEC = // ...
|
* gl_FragColor = czm_phong(normalize(positionToEyeEC), material, lightDirectionEC);
|
*
|
* @see czm_getMaterial
|
*/
|
vec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC)
|
{
|
// Diffuse from directional light sources at eye (for top-down)
|
float diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material);
|
if (czm_sceneMode == czm_sceneMode3D) {
|
// (and horizon views in 3D)
|
diffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material);
|
}
|
|
float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material);
|
|
// Temporary workaround for adding ambient.
|
vec3 materialDiffuse = material.diffuse * 0.5;
|
|
vec3 ambient = materialDiffuse;
|
vec3 color = ambient + material.emission;
|
color += materialDiffuse * diffuse * czm_lightColor;
|
color += material.specular * specular * czm_lightColor;
|
|
return vec4(color, material.alpha);
|
}
|
|
vec4 czm_private_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC)
|
{
|
float diffuse = czm_private_getLambertDiffuseOfMaterial(lightDirectionEC, material);
|
float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material);
|
|
vec3 ambient = vec3(0.0);
|
vec3 color = ambient + material.emission;
|
color += material.diffuse * diffuse * czm_lightColor;
|
color += material.specular * specular * czm_lightColor;
|
|
return vec4(color, material.alpha);
|
}
|