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

    Complete.

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.
