| Name |
| |
| ARB_conservative_depth |
| |
| Name String |
| |
| GL_ARB_conservative_depth |
| |
| Contact |
| |
| Graham Sellers, AMD (graham.sellers 'at' amd.com) |
| |
| Contributors |
| |
| Pierre Boudier, AMD |
| Graham Sellers, AMD |
| |
| Notice |
| |
| Copyright (c) 2011-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 2011/06/20. |
| Approved by the Khronos Promoters on 2011/07/29. |
| |
| Version |
| |
| Last Modified Date: 06/20/2010 |
| Author Revision: 6 |
| |
| Number |
| |
| ARB Extension #111 |
| |
| Dependencies |
| |
| OpenGL 3.0 is required. |
| |
| This extension is written against the OpenGL Shading Language Version 4.00. |
| |
| Overview |
| |
| There is a common optimization for hardware accelerated implementation of |
| OpenGL which relies on an early depth test to be run before the fragment |
| shader so that the shader evaluation can be skipped if the fragment ends |
| up being discarded because it is occluded. |
| |
| This optimization does not affect the final rendering, and is typically |
| possible when the fragment does not change the depth programmatically. |
| (i.e.: it does not write to the built-in gl_FragDepth output). There are, |
| however a class of operations on the depth in the shader which could |
| still be performed while allowing the early depth test to operate. |
| |
| This extension allows the application to pass enough information to the |
| GL implementation to activate such optimizations safely. |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification version 1.50.9 |
| |
| Additions to Chapter 1 of the OpenGL Shading Language 4.00.08 Specification (Introduction) |
| |
| None. |
| |
| Additions to Chapter 2 of the OpenGL Shading Language 4.00.08 Specification (Overview of OpenGL Shading) |
| |
| None. |
| |
| Additions to Chapter 3 of the OpenGL Shading Language 4.00.08 Specification (Basics) |
| |
| Add a new Section 3.3.x, GL_ARB_conservative_depth Extension |
| |
| Including the following line in a shader can be used to control the language |
| features described in this extension: |
| |
| #extension GL_ARB_conservative_depth: <behavior> |
| |
| where <behavior> is as described in section 3.3. |
| |
| A new preprocessor #define is added to the OpenGL Shading Language: |
| |
| #define GL_ARB_conservative_depth 1 |
| |
| Additions to Chapter 4 of the OpenGL Shading Language 4.00.08 Specification (Variables and Types) |
| |
| Modify Section 4.3.8.2 (Output Layout Qualifiers) page 47 |
| |
| Modify the paragraph beginning: "Fragment shaders allow output layout |
| qualifiers only..." |
| |
| Fragment shaders allow output layout qualifiers only on the interface |
| out, or for the purposes of redeclaring the built-in variable |
| gl_FragDepth (ses Section 7.2, Fragment Shader Special Variables). |
| |
| Insert the following before the paragraph beginning: "Geometry shaders can |
| have three types of output layout qualifiers..." |
| |
| The built-in fragment shader variable gl_FragDepth may be redeclared using |
| one of the following layout qualifiers. |
| |
| layout-qualifier-id |
| depth_any |
| depth_greater |
| depth_less |
| depth_unchanged |
| |
| For example: |
| |
| layout (depth_greater) out float gl_FragDepth; |
| |
| The layout qualifier for gl_FragDepth specifies constraints on the final |
| value of gl_FragDepth written by any shader invocation. GL implementations |
| may perform optimizations assuming that the depth test fails (or passes) |
| for a given fragment if all values of gl_FragDepth consistent with the layout |
| qualifier would fail (or pass). If the final value of gl_FragDepth |
| is inconsistent with its layout qualifier, the result of the depth test for |
| the corresponding fragment is undefined. However, no error will be |
| generated in this case. When the depth test passes and depth writes are |
| enabled, the value written to the depth buffer is always the value of |
| gl_FragDepth, whether or not it is consistent with the layout qualifier. |
| |
| By default, gl_FragDepth assumes the <depth_any> layout qualifier. When |
| the layout qualifier for gl_FragDepth is <depth_any>, the shader compiler |
| will note any assignment to gl_FragDepth modifying it in an unknown way, |
| and depth testing will always be performed after the shader has executed. |
| When the layout qualifier is "depth_greater", the GL will assume that the |
| final value of gl_FragDepth is greater than or equal to the fragment's |
| interpolated depth value, as given by the <z> component of gl_FragCoord. |
| When the layout qualifier is <depth_less>, the GL will assume that any |
| modification of gl_FragDepth will only decrease its value. When the |
| layout qualifier is <depth_unchanged>, the shader compiler will honor |
| any modification to gl_FragDepth, but the rest of the GL assume that |
| gl_FragDepth is not assigned a new value. |
| |
| Redeclarations of gl_FragDepth are performed as follows: |
| |
| // redeclaration that changes nothing is allowed |
| |
| out float gl_FragDepth; |
| |
| // assume it may be modified in any way |
| layout (depth_any) out float gl_FragDepth; |
| |
| // assume it may be modified such that its value will only increase |
| layout (depth_greater) out float gl_FragDepth; |
| |
| // assume it may be modified such that its value will only decrease |
| layout (depth_less) out float gl_FragDepth; |
| |
| // assume it will not be modified |
| layout (depth_unchanged) out float gl_FragDepth; |
| |
| If gl_FragDepth is redeclared in any fragment shader in a program, it must |
| be redeclared in all fragment shaders in that program that have static |
| assignments to gl_FragDepth. All redeclarations of gl_FragDepth in all |
| fragment shaders in a single program must have the same set of qualifiers. |
| Within any shader, the first redeclarations of gl_FragDepth must appear |
| before any use of gl_FragDepth. The built-in gl_FragDepth is only |
| predeclared in fragment shaders, so redeclaring it in any other shader |
| language will be illegal. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ----------------------------------------- |
| 6 6/20/2011 wwlk approved by ARB |
| 5 1/27/2011 johnk Update with edits from reviews of the core spec. |
| 4 12/17/2010 johnk Correct gl_Depth -> gl_FragDepth |
| Make the code examples fit within the width of |
| actual paper. |
| |
| 3 04/01/2010 gsellers Minor cleanup. Update to GLSL 4.00. |
| 2 12/01/2009 gsellers Internal updates |
| 1 11/03/2009 pboudier Initial draft |