| Name |
| |
| ARB_depth_clamp |
| |
| Name Strings |
| |
| GL_ARB_depth_clamp |
| |
| Contact |
| |
| Jon Leech (jon 'at' alumni.caltech.edu) |
| Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) |
| |
| Notice |
| |
| Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Specification Update Policy |
| |
| Khronos-approved extension specifications are updated in response to |
| issues and bugs prioritized by the Khronos OpenGL Working Group. For |
| extensions which have been promoted to a core Specification, fixes will |
| first appear in the latest version of that core Specification, and will |
| eventually be backported to the extension document. This policy is |
| described in more detail at |
| https://www.khronos.org/registry/OpenGL/docs/update_policy.php |
| |
| Status |
| |
| Complete. Approved by the ARB on July 3, 2009. |
| |
| Version |
| |
| Version 3, 2009/08/02. |
| Based on NV_depth_clamp version 4, modified 2003/01/08. |
| |
| Number |
| |
| ARB Extension #61 |
| |
| Dependencies |
| |
| Written based on the wording of the OpenGL 3.1 specification. |
| |
| ARB_compatibility affects the behavior of this extension. |
| |
| 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. |
| |
| Issues |
| |
| Another way to specify this functionality is to describe it in terms |
| of generating the equivalent capping geometry that would need to be |
| drawn at the near or far clip plane to have the same effect as not |
| clipping to the near and far clip planes and clamping interpolated |
| depth values outside the window-space depth range. Should the |
| functionality be described this way? |
| |
| RESOLUTION: No. Describing the functionality as capping is |
| fairly involved. Eliminating far and near plane clipping and |
| clamping interpolated depth values to the depth range is much |
| simpler to specify. |
| |
| Should depth clamping affect points or just line and polygon geometric |
| primitives? |
| |
| RESOLUTION: All geometric primitives are affected by depth |
| clamping. |
| |
| In the case of points, if you render a point "in front of" the |
| near clip plane, it should be rendered with the zw value min(n,f) |
| where n and f are the near and far depth range values if depth |
| clamping is enabled. Similarly, a point "behind" the far clip |
| plane should be rendered with the zw value max(n,f). |
| |
| How should the setting of the raster position function when depth |
| clamping is enabled? |
| |
| RESOLUTION: When setting the raster position, clamp the raster |
| position zw to the range [min(n,f),max(n,f)] where n and f are |
| the near and far depth range values. |
| |
| This rule ensures that the raster position zw will never be outside |
| the [0,1] range (because n and far are clamped to the [0,1] range). |
| We specify the raster position to be updated this way because |
| otherwise a raster position zw could be specified outside the [0,1] |
| range when depth clamping is enabled, but then if depth clamping |
| is subsequently disabled, that out-of-range raster position zw |
| could not be written to the depth buffer. |
| |
| This semantic can make for some unexpected semantics that are |
| described here. Say that depth clamping is enabled and the raster |
| position is set to point behind the far clip plane such that the |
| pre-clamped zw is 2.5. Because depth clamping is enabled the |
| raster position zw is clamped to the current near and far depth |
| range values. Say these values are 0.1 and 0.9. So 2.5 is clamped |
| to 0.9. |
| |
| Now consider what happens if a bitmap (or image rectangle) is |
| rendered with depth testing enabled under various situations. |
| If depth clamping remains enabled and the depth range is unchanged, |
| the bitmap fragments are generated with a zw of 0.9. |
| |
| However, if depth range is subsequently set to 0.2 and 0.8 and |
| depth clamping is enabled, the bitmap fragments will have their |
| zw depth component clamped to 0.8. But if the depth range was |
| changed to 0.2 and 0.8 but depth range clamped is disabled, the |
| bitmap fragments will have a 0.9 zw depth component since then |
| the depth clamping is then not applied. |
| |
| What push/pop attrib bits should affect the depth clamp enable? |
| |
| RESOLUTION: GL_ENABLE_BIT and GL_TRANSFORM_BIT. |
| |
| How does depth clamping interact with depth replace operations (say |
| from NV_texture_shader)? |
| |
| RESOLUTION: The depth clamp operation occurs as part of the depth |
| test so depth clamping occurs AFTER any depth replace operation |
| in the pipeline. A depth replace operation can reassign the |
| fragment's zw, but depth clamping if enabled will subsequently |
| clamp this new zw. |
| |
| Does depth clamping affect read/draw/copy pixels operations involving |
| depth component pixels? |
| |
| RESOLUTION: No. |
| |
| Does depth clamping occur after polygon offset? |
| |
| RESOLUTION: Yes. Depth clamping occurs immediately before the |
| depth test. |
| |
| Can fragments with wc<=0 be generated when this extension is supported? |
| |
| RESOLUTION: No. The OpenGL Specification was revised in 2006/08 to |
| remove explicit references to w_c <= 0, since the clip volume test |
| disallows all such vertices. Corresponding language has been |
| removed from this extension specification as well. Such fragments |
| should never be generated. |
| |
| 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 0x864F |
| |
| Additions to Chapter 2 of the OpenGL 3.1 Specification (OpenGL Operation) |
| |
| -- Section 2.17 "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 is DEPTH_CLAMP. 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)." |
| |
| |
| If and only if the ARB_compatibility extension is supported: |
| |
| -- Section 2.22 "Current Raster Position" |
| |
| Add to the end of the 4th paragraph: |
| |
| "If depth clamping (see section 2.11) is enabled, then raster |
| position z_w is first 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 2.12.1)." |
| |
| Additions to Chapter 3 of the OpenGL 3.1 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the OpenGL 3.1 Specification (Per-Fragment Operations |
| and the Framebuffer) |
| |
| -- Section 4.1.5 "Depth buffer test" |
| |
| Add to the end of the 2nd paragraph: |
| |
| "If depth clamping (see section 2.17) 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 2.12.1)." |
| |
| Additions to Chapter 5 of the OpenGL 3.1 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the OpenGL 3.1 Specification (State and State Requests) |
| |
| None |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| GLX Protocol |
| |
| None |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| Add to table 6.7, transformation state |
| |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| -------------- ---- ----------- ------------- -------------- ------ ---------------- |
| DEPTH_CLAMP B IsEnabled False Depth clamping 2.12.2 transform/enable |
| on/off |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Interactions with ARB_compatibility |
| |
| If ARB_compatibility is not supported, the language about current |
| raster position in section 2.22 is removed. |
| |
| Revision History |
| |
| Version 1, 2009/05/14 (Jon Leech) - rewrite NV_depth_clamp against |
| OpenGL 3.1 instead of OpenGL 1.2.1. Clarify which functionality only |
| applies to GL 3.1 + ARB_compatibility. Remove NV suffix and assign |
| ARB extension string in preparation for inclusion in OpenGL 3.2. |
| |
| Version 2, 2009/05/15 (Jon Leech) - Note interaction with |
| ARB_compatibility. |
| |
| Version 3, 2009/07/01 (Jon Leech) - Match core 3.2 spec updates, |
| removing w_c <= 0 language. Update corresponding issue to note this |
| was done to the core spec in 2006/08. |
| |
| Version 4, 2009/08/02 (Jon Leech) - Assign ARB extension number. |