80 lines
2.1 KiB
GLSL
80 lines
2.1 KiB
GLSL
#ifdef LOG_DEPTH
|
|
in 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(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_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 (__VERSION__ == 300 || defined(GL_OES_standard_derivatives))
|
|
// This factor doesn't work in IE 10
|
|
if (factor != 0.0) {
|
|
// 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_FragDepth = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne;
|
|
|
|
#ifdef POLYGON_OFFSET
|
|
// Apply the units after the log depth.
|
|
gl_FragDepth += 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
|
|
}
|