| Name |
| |
| EXT_frag_depth |
| |
| Name Strings |
| |
| GL_EXT_frag_depth |
| |
| Contributors |
| |
| Maurice Ribble |
| Robert Simpson |
| Jeff Leger |
| Bruce Merry |
| Acorn Pooley |
| |
| Contact |
| |
| Maurice Ribble (mribble 'at' qualcomm.com) |
| |
| Notice |
| |
| None |
| |
| Status |
| |
| Draft |
| |
| Version |
| |
| Date: July 21, 2010 |
| |
| Number |
| |
| OpenGL ES Extension #86 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| This extension is written against the OpenGL ES 2.0 specification, and |
| the OpenGL ES Shading Language 1.0.17 specification. |
| |
| OES_fragment_precision_high affects the definitions of this extension. |
| |
| Overview |
| |
| This extension adds the ability to set the depth value of a fragment from |
| within the fragment shader. Then this per-fragment depth value is used |
| for depth testing. This extension adds a built-in GLSL fragment shader |
| special varible to set the depth value. |
| |
| Much graphics hardware has the ability to do early depth testing before the |
| fragment shader. On such hardware there may be a performance penality for |
| using this feature so use this feature only when needed. |
| |
| Issues |
| |
| (1) Should the GLSL keyword be gl_FragDepth or gl_FragDepthEXT? |
| |
| RESOLVED: OpenGL has discussed this in the past and the agreement was that |
| we should use gl_FragDepthEXT. |
| |
| (2) What should the precission qualifier be for gl_FragDepthEXT? |
| |
| RESOLVED: If the OES_fragment_precision_high is supported then highp is |
| used, but if OES_fragment_precision_high not supported then mediump is |
| used. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| None |
| |
| New Keywords |
| |
| gl_FragDepthEXT |
| |
| New Built-in Functions |
| |
| None |
| |
| New Macro Definitions |
| |
| #define GL_EXT_frag_depth 1 |
| |
| Additions to Appendix A.3 Invariance Rules |
| |
| Rule 4: All fragment shaders that either conditionally or unconditionally |
| assign gl_FragCoord.z to gl_FragDepthEXT are depth-invariant with respect |
| to each other, for those fragments where the assignment to gl_FragDepthEXT |
| actually is done. |
| |
| Additions to Chapter 7 of the OpenGL ES Shading Language specification: |
| |
| Make the following changes to section 7.2 (Fragment Shader Special |
| Varibles). |
| |
| Replace the last sentence in the first paragraph with this: |
| |
| "Fragment shaders output values to the OpenGL ES pipeline using the |
| built-in variables gl_FragColor, gl_FragData, and gl_FragDepthEXT, unless the |
| discard keyword is executed." |
| |
| Add this between the first and second paragraphs: |
| |
| "The built-in varible gl_FragDepthEXT is optional, and must be enabled by |
| |
| #extension GL_EXT_frag_depth : enable |
| |
| before being used." |
| |
| Replace the first sentence in the second paragraph with this: |
| |
| "It is not a requirement for the fragment shader to write to gl_FragColor, |
| gl_FragData, or gl_FragDepthEXT." |
| |
| Add this paragraph after the paragraph that starts with "Writing to |
| gl_FragColor": |
| |
| "Writing to gl_FragDepthEXT will establish the depth value for the fragment |
| being processed. If MSAA is enabled, the depth value is copied to all |
| samples corresponding to the fragment. If depth buffering is enabled, and |
| no shader writes gl_FragDepthEXT, then the fixed function value for depth |
| will be used as the fragmentÂ’s depth value. If a shader statically assigns |
| a value to gl_FragDepthEXT, and there is an execution path through the |
| shader that does not set gl_FragDepthEXT, then the value of the fragmentÂ’s |
| depth may be undefined for executions of the shader that take that path. |
| That is, if the set of linked fragment shaders statically contain a write |
| to gl_FragDepthEXT, then it is responsible for always writing it." |
| |
| Replace the paragraph that starts with "If a shader executes the discard" |
| with this: |
| |
| "If a shader executes the discard keyword, the fragment is discarded, and |
| the values of any user-defined fragment outputs, gl_FragDepthEXT, |
| gl_FragColor, and gl_FragData become irrelevant." |
| |
| Replace the last sentence of the 9th paragraph with the following: |
| |
| The z component is the depth value that would be used for the fragment's |
| depth if the shader contained no writes to gl_FragDepthEXT. This is useful |
| for invariance if a shader conditionally computes gl_FragDepthEXT but |
| otherwise wants the fixed functionality fragment depth. |
| |
| Add this to the list of built-in varibles: |
| |
| If OES_fragment_precision_high is supported add this: |
| "highp float gl_FragDepthEXT;" |
| otherwise add this: |
| "mediump float gl_FragDepthEXT;" |
| |
| New State |
| |
| None |
| |
| Revision History |
| |
| 6/14/2010 Created. |
| 6/14/2010 Added language to cover MSAA. |
| 6/15/2010 Fixed some typos. |
| 7/2/2010 Fixed issues from Bruce. |
| Added wording to Appendix A.3. |
| Added issues 1 and 2. |
| 7/8/2010 Changed from OES to EXT. |
| Various updates from NV version of this extension. |
| 7/21/2010 Resolved issues 1 and 2. |
| |