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 parameter of Enable, Disable, and IsEnabled, and by the 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.