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 parameter of Enable, Disable, IsEnabled: FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD Accepted by the 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 is an integer between 0 and the value of MAX_DRAW_BUFFERS minus one, inclusive. Errors: - INVALID_VALUE error is generated if 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 are undefined. If the fragment color will be written to multiple color buffers (e.g. via the 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 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.