Name

    AMD_depth_clamp_separate

Name Strings

    GL_AMD_depth_clamp_separate

Contact

    Pierre Boudier (pierre.boudier 'at' amd.com)

Contributors

    Pierre Boudier, AMD
    Graham Sellers, AMD

Status

    In Progress

Version

    Last Modified Date:         09/15/2010
    Author Revision:            2

Number

    401

Dependencies

    The extension is written against the OpenGL 4.1 (Core) Specification.

Overview

    The extension ARB_depth_clamp introduced the ability to control
    the clamping of the depth value for both the near and far plane.
    One limitation is that the control was for both planes at the
    same time; some applications can benefit from having clamping
    enabled for only one of the two planes, in order to save
    fillrate for the other plane by clipping the geometry.

    This extension provides exactly such functionality.

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, and GetDoublev:

        DEPTH_CLAMP_NEAR_AMD                                 0x901E
        DEPTH_CLAMP_FAR_AMD                                  0x901F

Additions to Chapter 2 of the OpenGL 4.1 (Core) Specification (OpenGL Operation)

    Section 2.20 "Primitive Clipping"

    Add to the end of the 3rd paragraph:

    "Depth clamping is enabled with the generic Enable command and
    disabled with the Disable command. The value of the argument to
    either command may be DEPTH_CLAMP_NEAR_AMD or DEPTH_CLAMP_FAR_AMD to enable
    or disable depth clamping at the near and far planes, respectively. If near
    depth clamping is enabled, the "-w_c <= z_c" plane equation is ignored by
    view volume clipping. Effectively, there is no near plane. Likewise, if far
    clamping is enabled, the "z_c <= w_c" plane equation is ignored by view
    volume clipping, effectively removing the near plane."

    "In addition to DEPTH_CLAMP_NEAR_AMD and DEPTH_CLAMP_FAR_AMD, the token
    DEPTH_CLAMP may be used to simultaneously enable or disable depth clamping
    at both the near and far planes."

Additions to Chapter 3 of the OpenGL 4.1 (Core) Specification (Rasterization)

    None.

Additions to Chapter 4 of the OpenGL 4.1 (Core) Specification (Per-Fragment
Operations and the Frame Buffer)

 --  Section 4.1.5 "Depth buffer test"

    Add to the end of the 2nd paragraph:

    "If depth clamping (see section 2.20) is enabled, before the incoming
    fragment's z_w is compared z_w is clamped to the range [min(n,f),0] if
    clamping at the near plane is enabled, [0, max(n,f)] if clamping at the
    far plane is enabled, and [min(n,f), max(n,f)] if clamping is enabled at
    both the near and far planes, where n and f are the current near and far
    depth range values (see section 2.12.1)."

Additions to Chapter 5 of the OpenGL 4.1 (Core) Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 4.1 (Core) Specification (State and
State Requests)

    None.

Additions to Appendix A of the OpenGL 4.1 (Core) Specification (Invariance)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

Errors

    None.

New State

Add to table 6.9, Transformation State - p.350

    +----------------------+---------+---------------+---------------+-------------------------+-------+
    | Get Value            | Type    | Get Command   | Initial Value | Description             | Sec   |
    +----------------------+---------+---------------+---------------+-------------------------+-------+
    | DEPTH_CLAMP_NEAR_AMD | B       | IsEnabled     | FALSE         | Depth clamping enabled  | 2.20  |
    |                      |         |               |               | at the near plane       |       |
    | DEPTH_CLAMP_FAR_AMD  | B       | IsEnabled     | FALSE         | Depth clamping enabled  | 2.20  |
    |                      |         |               |               | at the far plane        |       |
    +----------------------+---------+---------------+---------------+-------------------------+-------+

    * Note that DEPTH_CLAMP still exists. However, enabling it enables depth clamping for both
    the near and the far plane. Querying DEPTH_CLAMP will return TRUE if DEPTH_CLAMP_NEAR_AMD _or_
    DEPTH_CLAMP_FAR_AMD is enabled.

New Implementation Dependent State

    None

Issues

    1) What should happen to GL_DEPTH_CLAMP? What happens if depth clamping is
    enabled at one plane, but not the other - what does glIsEnabled(GL_DEPTH_CLAMP)
    return?

    DISCUSSION: Right now, glIsEnabled(GL_DEPTH_CLAMP) returns GL_TRUE if clamping
    is enabled at either plane. Other options are to return GL_TRUE only if clamping
    is enabled at both planes, or to maintain traditional depth clamping as
    separate state, and have yet another enable to control separate clamping.

Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  -----------------------------------------

     2    09/15/2010  gsellers  Update to stand against OpenGL 4.1
                                Add token values.
                                Minor cleanup.
                                Some clarifications.
                                Add issue 1.
     1    11/19/2009  pboudier  Initial draft based on ARB_depth_clamp
