| Name |
| |
| NV_fragment_coverage_to_color |
| |
| Name Strings |
| |
| GL_NV_fragment_coverage_to_color |
| |
| Contact |
| |
| Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) |
| Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) |
| Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) |
| |
| Contributors |
| |
| Jeff Bolz, NVIDIA Corporation |
| Pat Brown, NVIDIA Corporation |
| Mark Kilgard, NVIDIA Corporation |
| James Helferty, NVIDIA Corporation |
| |
| Status |
| |
| Shipping |
| |
| Version |
| |
| Last Modified Date: March 27, 2015 |
| Revision: 2 |
| |
| Number |
| |
| OpenGL Extension #467 |
| OpenGL ES Extension #229 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.3 specification |
| (Compatibility Profile). |
| |
| This extension interacts with NV_multisample_coverage. |
| |
| This extension interacts with EXT_raster_multisample and |
| NV_framebuffer_mixed_samples. |
| |
| This extension interacts with OpenGL ES 3.1. |
| |
| When implemented for OpenGL ES 3.1, this extension interacts with |
| OES_sample_shading. |
| |
| Overview |
| |
| This extension allows the fragment coverage value, represented as an |
| integer bitfield, to be substituted for a color output being written to a |
| single-component color buffer with integer components (e.g., R8UI). The |
| capability provided by this extension is different from simply writing the |
| gl_SampleMask fragment shader output in that the coverage value written to |
| the framebuffer is taken after alpha test, stencil test, and depth test, |
| as well as after the multisample fragment operations such as |
| alpha-to-coverage. |
| |
| This functionality may be useful for deferred rendering algorithms, where |
| the second pass needs to know which samples belong to which original |
| fragments. |
| |
| New Procedures and Functions |
| |
| void FragmentCoverageColorNV(uint color); |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter of Enable, Disable, IsEnabled: |
| |
| FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetDoublev, |
| GetIntegerv, and GetFloatv: |
| |
| FRAGMENT_COVERAGE_COLOR_NV 0x92DE |
| |
| Additions to Chapter 17 of the OpenGL 4.3 (Compatibility Profile) Specification |
| (Rasterization) |
| |
| Modify Figure 17.1 (Per-fragment operations), p. 530 |
| |
| Add a new box "Fragment Coverage to Color" between "Occlusion Query" and |
| "Blending". |
| |
| (note: If EXT_raster_multisample or NV_framebuffer_mixed_samples are |
| supported, the "Coverage Reduction" stage is after the "Fragment coverage |
| to color" stage.) |
| |
| |
| Add a new Section 17.3.X (Fragment Coverage to Color) between 17.3.6 (Depth |
| Buffer Test) and 17.3.7 (Occlusion Queries) |
| |
| Fragment coverage to color is enabled or disabled with the generic Enable |
| and Disable commands using the symbolic constant |
| FRAGMENT_COVERAGE_TO_COLOR_NV. When disabled, this step is skipped. When |
| enabled, the fragment coverage, treated as an integer bitfield, is |
| substituted for the red component of one of the fragment color values. |
| The fragment color value updated with the coverage mask is specified using |
| |
| FragmentCoverageColorNV(uint color); |
| |
| where <color> is an integer between 0 and the value of MAX_DRAW_BUFFERS |
| minus one, inclusive. |
| |
| Errors: |
| |
| - INVALID_VALUE error is generated if <color> is greater than or equal to |
| MAX_DRAW_BUFFERS. |
| |
| If the buffer that the coverage value will be written to does not have a |
| RED base internal format with signed or unsigned integer components, then |
| the values output in color <color> are undefined. If the fragment color |
| will be written to multiple color buffers (e.g. via the <DrawBuffer> |
| command using FRONT_AND_BACK), then the values written to those buffers |
| are undefined. |
| |
| If the color buffer has fewer bits than the sample coverage, the low bits |
| of the sample coverage will be taken without any clamping. If the buffer |
| has more bits than the sample coverage, the high bits of the sample |
| coverage will be filled with zeros. |
| |
| If SAMPLE_SHADING is enabled, the coverage is split among the multiple |
| fragment invocations processed per pixel. |
| |
| |
| New Implementation Dependent State |
| |
| None. |
| |
| New State |
| |
| Get Value Get Command Type Initial Value Attribute |
| --------- ----------- ---- ------------- --------- |
| FRAGMENT_COVERAGE_TO_COLOR_NV IsEnabled B FALSE enable/color-buffer |
| FRAGMENT_COVERAGE_COLOR_NV GetIntegerv Z+ 0 color-buffer |
| |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| GLX Protocol |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.30 |
| |
| None. |
| |
| Errors |
| |
| INVALID_VALUE is generated by FragmentCoverageColorNV if <color> is greater |
| than or equal to the value of MAX_DRAW_BUFFERS. |
| |
| Dependencies on NV_multisample_coverage |
| |
| The coverage values written to the color buffer only includes bits for |
| color samples, not for coverage samples. |
| |
| Dependencies on EXT_raster_multisample and NV_framebuffer_mixed_samples |
| |
| If the number of effective raster samples is greater than the number of |
| color samples, then each color sample receives the full coverage mask of |
| the fragment. |
| |
| Interactions with OpenGL ES 3.1 |
| |
| If OES_sample_shading is present, change all references to SAMPLE_SHADING |
| to SAMPLE_SHADING_OES. Otherwise, ignore all references to SAMPLE_SHADING. |
| |
| Ignore all references to GetDoublev. |
| |
| In new section titled "Fragment Coverage to Color", remove the last |
| sentence from the paragraph beginning "If the buffer that the coverage |
| value will be written to...", which refers to writing a single color value |
| to multiple color buffers. |
| |
| Issues |
| |
| 1) If coverage information is written to a color buffer with multiple |
| components or non-integer components, should this case be treated as |
| undefined, as an error, or should writes be implicitly disabled? |
| |
| RESOLVED: Undefined. |
| |
| 2) How do we handle fewer/more bits in the sample coverage than in the |
| color buffer? |
| |
| RESOLVED: If there are fewer bits in the sample coverage than the color |
| buffer, the mask is zero-extended. If there are more bits in the sample |
| coverage than the color buffer, only the LSBs are written. |
| |
| 3) How does this interact with EXT_raster_multisample/ |
| NV_framebuffer_mixed_samples? |
| |
| RESOLVED: Coverage to color may be used while the number of effective |
| raster samples is greater than the number of color samples. All color |
| samples (that are written) will receive the same coverage mask. |
| |
| 4) Where does this belong in the pipeline? |
| |
| RESOLVED: Anywhere between "depth test" and "color logic op" will work. |
| Since this only works for integer buffers, blending and sRGB are |
| irrelevant. However, color logic op can be used just like in normal |
| integer color rendering. |
| |
| (5) How does this interact with sample shading? |
| |
| RESOLVED: Sample shading effectively splits a pixel into several fragment |
| shader invocations, and each invocation receives a partial coverage mask. |
| When these invocations reach the coverage-to-color stage, they write out |
| their partial coverage. |
| |
| (6) When using NV_fragment_coverage_to_color with EXT_raster_multisample |
| or NV_framebuffer_mixed_samples, how do these features interact? |
| |
| RESOLVED: Both may be used simultaneously, and the coverage_to_color |
| functionality is applied before coverage reduction in the pipeline. This |
| means the full raster sample mask will be written to the color buffer, not |
| the reduced color sample mask. |
| |
| Revision History |
| |
| Revision 2, 2015/03/27 |
| - Add ES interactions |
| |
| Revision 1 |
| - Internal revisions. |