Name

    EXT_depth_clamp

Name Strings

    GL_EXT_depth_clamp

Contact

    Gert Wollny (gert.wollny 'at' collabora.com)

Notice

    Copyright (c) 2019 Collabora LTD 
    Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    FIXME

Version

    Version 1, 2019/01/24.
    Based on ARB_depth_clamp version 4, modified 2009/08/02.

Number

    #309

Dependencies

    OpenGL ES 2.0 is required.
    Written based on the wording of the OpenGL ES 3.2 specification.

Overview

    Conventional OpenGL clips geometric primitives to a clip volume
    with six faces, two of which are the near and far clip planes.
    Clipping to the near and far planes of the clip volume ensures that
    interpolated depth values (after the depth range transform) must be
    in the [0,1] range.

    In some rendering applications such as shadow volumes, it is useful
    to allow line and polygon primitives to be rasterized without
    clipping the primitive to the near or far clip volume planes (side
    clip volume planes clip normally).  Without the near and far clip
    planes, rasterization (pixel coverage determination) in X and Y
    can proceed normally if we ignore the near and far clip planes.
    The one major issue is that fragments of a  primitive may extend
    beyond the conventional window space depth range for depth values
    (typically the range [0,1]).  Rather than discarding fragments that
    defy the window space depth range (effectively what near and far
    plane clipping accomplish), the depth values can be clamped to the
    current depth range.

    This extension provides exactly such functionality.  This
    functionality is useful to obviate the need for near plane capping
    of stenciled shadow volumes.  The functionality may also be useful
    for rendering geometry "beyond" the far plane if an alternative
    algorithm (rather than depth testing) for hidden surface removal is
    applied to such geometry (specifically, the painter's algorithm).
    Similar situations at the near clip plane can be avoided at the
    near clip plane where apparently solid objects can be "seen through"
    if they intersect the near clip plane.

New Procedures and Functions

    None

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
    and by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv:

        DEPTH_CLAMP_EXT                               0x864F

Additions to Chapter 12 of the OpenGL ES 3.2 Specification (Fixed-Function Vertex Post-Processing)

 --  Section 12.5 "Primitive Clipping"

    Add to the end of the 1st paragraph:

    "Depth clamping is enabled with the generic Enable command and
    disabled with the Disable command. The value of the argument to
    either command is DEPTH_CLAMP_EXT. If depth clamping is enabled, the
    "-w_c <= z_c <= w_c" plane equation are ignored by view volume
    clipping (effectively, there is no near or far plane clipping)."

Additions to Chapter 15 of the OpenGL ES 3.2 Specification (Writing Fragments and Samples to the Framebuffer)

 --  Section 15.1.3 "Depth buffer test"

    Add to the end of the 2nd paragraph:

    "If depth clamping (see section 12.15) is enabled, before the
    incoming fragment's z_w is compared z_w is clamped to the range
    [min(n,f),max(n,f)], where n and f are the current near and far
    depth range values (see section 12.6.1)."

Additions to the AGL/GLX/WGL Specifications

    None

GLX Protocol

    None

Errors

    None

New State

Add to table 6.4, transformation state

Get Value       Type  Get Command  Initial Value  Description     Sec    
--------------  ----  -----------  -------------  --------------  ------ 
DEPTH_CLAMP_EXT  B     IsEnabled    False          Depth clamping  12.5  
                                                  on/off

New Implementation Dependent State

    None

Issues

    See the issue list in GL_ARB_depth_clamp.

    Can fragments with w_c <=0 be generated when this extension is supported?
 
      RESOLUTION: No. The inequalities in OpenGL ES Specification 12.5 clarify 
      that only primitives that lie in the region w_c >= 0 can be produced by
      clipping and the vertex normalization in 12.6 clarifies that values 
      w_c = 0 are prohibited. Hence fragments with w_c <= 0 should also never
      be generated when this extension is supported.

    How does this extension differ from ARB_depth_clamp? 
      
      Instead of DEPTH_CLAMP the parameter is called DEPTH_CLAMP_EXT.
      Push/pop attrib bits are not relevant for OpenGL ES. 

Revision History

    Version 1, 2019/01/25 (Gert Wollny) - rewrite ARB_depth_clamp against
    OpenGL ES 3.2 instead of OpenGL 3.1.
