| Name |
| |
| EXT_post_depth_coverage |
| |
| Name Strings |
| |
| GL_EXT_post_depth_coverage |
| |
| Contact |
| |
| Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) |
| Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) |
| |
| Contributors |
| |
| Jeff Bolz, NVIDIA |
| Pat Brown, NVIDIA |
| James Helferty, NVIDIA |
| |
| Status |
| |
| Shipping |
| |
| Version |
| |
| Last Modified Date: March 27, 2015 |
| Revision: 2 |
| |
| Number |
| |
| OpenGL Extension #461 |
| OpenGL ES Extension #225 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.3 specification |
| (Compatibility Profile). |
| |
| This extension is written against version 4.30 of the OpenGL |
| Shading Language Specification. |
| |
| This extension interacts with NV_fragment_program4. |
| |
| This extension interacts with OpenGL ES 3.1 |
| |
| If implemented in OpenGL ES 3.1, OES_sample_variables (providing |
| gl_SampleMaskIn) is required. |
| |
| Overview |
| |
| This extension allows the fragment shader to control whether values in |
| gl_SampleMaskIn[] reflect the coverage after application of the early |
| depth and stencil tests. This feature can be enabled with the following |
| layout qualifier in the fragment shader: |
| |
| layout(post_depth_coverage) in; |
| |
| To use this feature, early fragment tests must also be enabled in the |
| fragment shader via: |
| |
| layout(early_fragment_tests) in; |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| None. |
| |
| Additions to Chapter 15 of the OpenGL 4.3 (Compatibility Profile) Specification |
| (Rasterization) |
| |
| Modify Section 15.1 Fragment Shader Variables, p. 508 |
| |
| (modify the third paragraph on p. 509) |
| |
| ...When interpolating variables declared using "centroid in", the variable |
| is sampled at a location within the pixel covered by the primitive |
| generating the fragment. The fragment shader layout qualifier |
| "post_depth_coverage" (Section 15.2.2) does not affect the determination of the |
| centroid location. |
| |
| Modify Section 15.2.2 Shader Inputs, p. 511 |
| |
| (modify the first paragraph on p. 513) |
| |
| ...Bit <n> of element <w> in the array is set if and only if the sample |
| numbered <32w + n> is considered covered for this fragment shader |
| invocation. If the fragment shader specifies the "early_fragment_tests" and |
| "post_depth_coverage" layout qualifiers, then the sample is considered covered |
| if and only if the sample is covered by the primitive and the sample passes |
| the early fragment tests (as described in Section 15.2.4). If these layout |
| qualifiers are not specified, then the sample is considered covered if the |
| sample is covered by the primitive, regardless of the result of the |
| fragment tests. ... |
| |
| |
| New Implementation Dependent State |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| GLX Protocol |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.30 |
| |
| Including the following line in a shader can be used to control the |
| language features described in this extension: |
| |
| #extension GL_EXT_post_depth_coverage : <behavior> |
| |
| where <behavior> is as specified in section 3.3. |
| |
| New preprocessor #defines are added to the OpenGL Shading Language: |
| |
| #define GL_EXT_post_depth_coverage 1 |
| |
| |
| Modify Section 4.4.1.3 Fragment Shader Inputs (p. 58) |
| |
| (replace the discussion of early_fragment_tests on p. 59) |
| |
| Fragment shaders also allow the following layout qualifiers on "in" only (not |
| with variable declarations) |
| |
| layout-qualifier-id |
| early_fragment_tests |
| post_depth_coverage |
| |
| For example, |
| |
| layout(early_fragment_tests) in; |
| layout(post_depth_coverage) in; |
| |
| "early_fragment_tests" requests that fragment tests be performed before |
| fragment shader execution, as described in section 15.2.4 "Early Fragment |
| Tests" of the OpenGL Specification. If this is not declared, per-fragment |
| tests will be performed after fragment shader execution. |
| "post_depth_coverage" requests that the built-in "gl_SampleMaskIn[]" will |
| reflect the result of the early fragment tests, as described in section |
| 15.2.2 "Shader Inputs" of the OpenGL Specification. |
| |
| Only one fragment shader (compilation unit) need declare these, though |
| more than one can. If at least one fragment shader declares one of these, |
| then it is enabled. If any fragment shader declares "post_depth_coverage" |
| and none declare "early_fragment_tests", a link-time error will occur. |
| |
| |
| Dependencies on NV_fragment_program4 |
| |
| Modify Section 2.X.6.Y of the NV_fragment_program4 specification |
| |
| (add new option section) |
| |
| + Post-depth Coverage (EXT_post_depth_coverage) |
| |
| If a fragment program specifies the "EXT_post_depth_coverage" option, the |
| sample mask will reflect the result of the early fragment tests, as |
| described in Section 15.2.2 "Shader Inputs". If a fragment program |
| specifies the EXT_post_depth_coverage option and not the |
| NV_early_fragment_tests option, it will fail to compile. |
| |
| |
| Interactions with OpenGL ES 3.1 |
| |
| If OpenGL ES 3.1 is supported, edits similar to those above are applied to |
| OpenGL ES 3.1 and GLSL ES 3.10 specifications. |
| |
| Modify the edits under "Fragment Shader Inputs" as follows: |
| |
| Add the following to the paragraph discussing behavior when |
| "early_fragment_tests" is enabled to reflect a pre-existing error not |
| shared with GLSL 4.30: |
| |
| It is an error to statically write to gl_FragDepth in the fragment |
| shader. |
| |
| Change the paragraph beginning "Only one fragment shader (compilation unit) |
| need declare..." to the following, since GLSL ES 3.10 does not support |
| linking multiple shaders of the same type: |
| |
| If a fragment shader declares "post_depth_coverage" and doesn't declare |
| "early_fragment_tests", a link-time error will occur. |
| |
| Errors |
| |
| None. |
| |
| Issues |
| |
| (1) Should the determination of a fragment's centroid use the pre-depth or |
| post-depth coverage? |
| |
| RESOLVED: In this extension, it uses the pre-depth coverage. This way the |
| centroid location (and hence the result of shading) does not depend on the |
| rendering order, which is almost certainly the desired result for 3D |
| rendering. |
| |
| For path rendering, it would be desirable to use post-depth centroid since |
| the stencil test really determines whether samples are inside the primitive |
| rather than whether samples are "occluded," and guaranteeing attributes |
| are sampled inside the path would be nice. |
| |
| Revision History |
| |
| Revision 2, 2015/03/27 |
| - Add ES interactions |
| |
| Revision 1, September 12, 2014 (jbolz, pbrown, jhelferty) |
| |
| Internal spec development. |