// emulated noperspective
|
#if defined(GL_EXT_frag_depth) && !defined(LOG_DEPTH)
|
varying float v_WindowZ;
|
#endif
|
|
/**
|
* Emulates GL_DEPTH_CLAMP, which is not available in WebGL 1 or 2.
|
* GL_DEPTH_CLAMP clamps geometry that is outside the near and far planes,
|
* capping the shadow volume. More information here:
|
* https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_depth_clamp.txt.
|
*
|
* When GL_EXT_frag_depth is available we emulate GL_DEPTH_CLAMP by ensuring
|
* no geometry gets clipped by setting the clip space z value to 0.0 and then
|
* sending the unaltered screen space z value (using emulated noperspective
|
* interpolation) to the frag shader where it is clamped to [0,1] and then
|
* written with gl_FragDepth (see czm_writeDepthClamp). This technique is based on:
|
* https://stackoverflow.com/questions/5960757/how-to-emulate-gl-depth-clamp-nv.
|
*
|
* When GL_EXT_frag_depth is not available, which is the case on some mobile
|
* devices, we must attempt to fix this only in the vertex shader.
|
* The approach is to clamp the z value to the far plane, which closes the
|
* shadow volume but also distorts the geometry, so there can still be artifacts
|
* on frustum seams.
|
*
|
* @name czm_depthClamp
|
* @glslFunction
|
*
|
* @param {vec4} coords The vertex in clip coordinates.
|
* @returns {vec4} The modified vertex.
|
*
|
* @example
|
* gl_Position = czm_depthClamp(czm_modelViewProjection * vec4(position, 1.0));
|
*
|
* @see czm_writeDepthClamp
|
*/
|
vec4 czm_depthClamp(vec4 coords)
|
{
|
#ifndef LOG_DEPTH
|
#ifdef GL_EXT_frag_depth
|
v_WindowZ = (0.5 * (coords.z / coords.w) + 0.5) * coords.w;
|
coords.z = 0.0;
|
#else
|
coords.z = min(coords.z, coords.w);
|
#endif
|
#endif
|
return coords;
|
}
|