#ifdef LOG_DEPTH
|
varying float v_depthFromNearPlusOne;
|
|
#ifdef POLYGON_OFFSET
|
uniform vec2 u_polygonOffset;
|
#endif
|
|
#endif
|
|
/**
|
* Writes the fragment depth to the logarithmic depth buffer.
|
* <p>
|
* Use this when the vertex shader does not call {@link czm_vertexlogDepth}, for example, when
|
* ray-casting geometry using a full screen quad.
|
* </p>
|
* @name czm_writeLogDepth
|
* @glslFunction
|
*
|
* @param {float} depth The depth coordinate, where 1.0 is on the near plane and
|
* depth increases in eye-space units from there
|
*
|
* @example
|
* czm_writeLogDepth((czm_projection * v_positionEyeCoordinates).w + 1.0);
|
*/
|
void czm_writeLogDepth(float depth)
|
{
|
#if defined(GL_EXT_frag_depth) && defined(LOG_DEPTH)
|
// Discard the vertex if it's not between the near and far planes.
|
// We allow a bit of epsilon on the near plane comparison because a 1.0
|
// from the vertex shader (indicating the vertex should be _on_ the near
|
// plane) will not necessarily come here as exactly 1.0.
|
if (depth <= 0.9999999 || depth > czm_farDepthFromNearPlusOne) {
|
discard;
|
}
|
|
#ifdef POLYGON_OFFSET
|
// Polygon offset: m * factor + r * units
|
float factor = u_polygonOffset[0];
|
float units = u_polygonOffset[1];
|
|
// If we can't compute derivatives, just leave out the factor I guess?
|
#ifdef GL_OES_standard_derivatives
|
// m = sqrt(dZdX^2 + dZdY^2);
|
float x = dFdx(depth);
|
float y = dFdy(depth);
|
float m = sqrt(x * x + y * y);
|
|
// Apply the factor before computing the log depth.
|
depth += m * factor;
|
#endif
|
|
#endif
|
|
gl_FragDepthEXT = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne;
|
|
#ifdef POLYGON_OFFSET
|
// Apply the units after the log depth.
|
gl_FragDepthEXT += czm_epsilon7 * units;
|
#endif
|
|
#endif
|
}
|
|
/**
|
* Writes the fragment depth to the logarithmic depth buffer.
|
* <p>
|
* Use this when the vertex shader calls {@link czm_vertexlogDepth}.
|
* </p>
|
*
|
* @name czm_writeLogDepth
|
* @glslFunction
|
*/
|
void czm_writeLogDepth() {
|
#ifdef LOG_DEPTH
|
czm_writeLogDepth(v_depthFromNearPlusOne);
|
#endif
|
}
|