blob: 8c057f6954bfbe632f812e9ccbe99cfe4a84da20 [file] [log] [blame]
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.