| Name |
| |
| EXT_multisample_compatibility |
| |
| Name Strings |
| |
| GL_EXT_multisample_compatibility |
| |
| Contact |
| |
| Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) |
| |
| Contributors |
| |
| Daniel Koch, NVIDIA Corporation |
| Slawomir Grajewski, Intel |
| Shannon Woods, Google |
| |
| Status |
| |
| Complete |
| |
| Exposed in ES contexts in NVIDIA drivers 358.00 (Septmeber 2015) |
| and later. |
| |
| Version |
| |
| Last Modified Date: July 30, 2015 |
| Revision: 5 |
| |
| Number |
| |
| OpenGL ES Extension #248 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL ES 3.1 (April 29, 2015) |
| specification, but can apply to earlier versions. |
| |
| This extension interacts with OES_sample_variables. |
| |
| Overview |
| |
| This extension allows disabling and enabling of multisampling. |
| |
| OpenGL ES 2.x/3.x both support multisampling but provide no way to |
| disable multisampling for drawables with multiple samples. |
| |
| This introduces the MULTISAMPLE and SAMPLE_ALPHA_TO_ONE enables |
| (though EXT suffixed) that operate identically to the OpenGL 4.5 core |
| profile (as they have existed in OpenGL since OpenGL 1.3 and earlier |
| with the ARB_multisample, EXT_multisample, and SGIS_multisample |
| extensions). |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter to Enable, Disable, and IsEnabled |
| and the <pname> parameter to GetBooleanv, GetIntegerv, GetFloatv, |
| and GetInteger64v: |
| |
| MULTISAMPLE_EXT 0x809D |
| SAMPLE_ALPHA_TO_ONE_EXT 0x809F |
| |
| Additions to Chapter 13 of the OpenGL ES 3.1 Specification (Fixed-Function |
| Primitive Assembly and Rasterization) |
| |
| Insert between the 8th and 9th paragraphs in Section 13.2.1 |
| (Multisampling) the following: |
| |
| "Multisample rasterization is enabled or disabled by calling Enable |
| or Disable with the symbolic constant MULTISAMPLE_EXT. |
| |
| If MULTISAMPLE_EXT is disabled, multisample rasterization of all |
| primitives is equivalent to single-sample (fragment-center) |
| rasterization, except that the fragment coverage value is set to |
| full coverage. The color and depth values and the sets of texture |
| coordinates may all be set to the values that would have been assigned |
| by single-sample rasterization, or they may be assigned as described |
| below for multisample rasterization." |
| |
| Replace the first sentence of Section 13.3.2 (Point Multisample |
| Rasterization) with: |
| |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is |
| one, then points are rasterized using the following algorithm." |
| |
| Replace the first sentence of Section 13.4.3 (Line Multisample |
| Rasterization) with: |
| |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is |
| one, then lines are rasterized using the following algorithm." |
| |
| Replace the first sentence of Section 13.5.3 (Polygon Multisample |
| Rasterization) with: |
| |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is |
| one, then polygons are rasterized using the following algorithm." |
| |
| Additions to Chapter 15 of the OpenGL ES 3.1 Specification (Writing Fragments and |
| Samples to the Framebuffer) |
| |
| Change the first sentence of 15.1.1 (Alpha to Coverage) to read: |
| |
| "This step modifies fragment alpha and coverage values based on the |
| value of SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE_EXT. If the |
| value of SAMPLE_BUFFERS is not one, MULTISAMPLE_EXT is disabled, |
| or if draw buffer zero is not NONE and the buffer it references has |
| an integer format, the operation is skipped." |
| |
| Add the following paragraph after the 2nd paragraph starting "Alpha |
| to coverage is enabled...": |
| |
| "Alpha to one is enabled or disabled by calling Enable and Disable |
| with target SAMPLE_ALPHA_TO_ONE_EXT." |
| |
| Add the following paragraph after the fourth paragraph ("If |
| SAMPLE_ALPHA_TO_COVERAGE ...") in 15.1.1: |
| |
| "Next, if SAMPLE_ALPHA_TO_ONE_EXT is enabled, each alpha value is |
| replaced by the maximum representable alpha value for fixed-point |
| color buffers, or by 1.0 for floating-point buffers. Otherwise, |
| the alpha values are not changed." |
| |
| Insert the following paragraph after the third paragraph in Section |
| 15.1.8: |
| |
| "If MULTISAMPLE_EXT is disabled, and the value of SAMPLE_BUFFERS |
| is one, the fragment may be treated exactly as described above, |
| with optimization possible because the fragment coverage must |
| be set to full coverage. Further optimization is allowed, |
| however. An implementation may choose to identify a centermost |
| sample, and to perform alpha, stencil, and depth tests on only that |
| sample. Regardless of the outcome of the stencil test, all multisample |
| buffer stencil sample values are set to the appropriate new stencil |
| value. If the depth test passes, all multisample buffer depth sample |
| values are set to the depth of the fragment's centermost sample's |
| depth value, and all multisample buffer color sample values are set |
| to the color value of the incoming fragment. Otherwise, no change |
| is made to any multisample buffer color or depth value." |
| |
| Dependencies on OES_sample_variables |
| |
| When OES_sample_variables is supported, amend its language so |
| multisampling related sample variables depend on the MULTISAMPLE_EXT |
| enable state. |
| |
| Change the paragraph describing the gl_SampleID and gl_NumSamples |
| variables to read: |
| |
| "The built-in read-only variable gl_SampleID is filled with |
| the sample number of the sample currently being processed. This |
| variable is in the range zero to gl_NumSamples minus one, where |
| gl_NumSamples is the total number of samples in the framebuffer, or |
| one if rendering to a non-multisample framebuffer or MULTISAMPLE_EXT |
| is disabled. Using gl_SampleID in a fragment shader causes the entire |
| shader to be executed per-sample. When rendering to a non-multisample |
| buffer or MULTISAMPLE_EXT is disabled, gl_SampleID will always be |
| zero. gl_NumSamples is the sample count of the framebuffer regardless |
| of whether the framebuffer is multisampled or not." |
| |
| Change the last sentence of the paragraph describing the |
| gl_SamplePosition variable: |
| |
| "When rendering to a non-multisample buffer or MULTISAMPLE_EXT is |
| disabled, gl_SamplePosition will always be (0.5, 0.5)." |
| |
| Change the appropriate sentence describing the gl_SampleMaskIn |
| variable: |
| |
| "When rendering to a non-multisample buffer or MULTISAMPLE_EXT |
| is disabled, all bits are zero except for bit zero of the first |
| array element. That bit will be one if the pixel is covered and |
| zero otherwise." |
| |
| Change the paragraph of the GLSL language (section 7.2) describing |
| gl_SampleID to read: |
| |
| "The input variable gl_SampleID is filled with the sample number of |
| the sample currently being processed. This variable is in the range |
| 0 to gl_NumSamples-1, where gl_NumSamples is the total number of |
| samples in the framebuffer, or one if rendering to a non-multisample |
| framebuffer or MULTISAMPLE_EXT is disabled. Any static use of |
| gl_SampleID in a fragment shader causes the entire shader to be |
| executed per-sample." |
| |
| New State |
| |
| Modify Table 20.7, Multisampling |
| |
| Add: |
| |
| Initial |
| Get Value Type Get Command Value Description Sec. |
| ----------------------- ---- ----------- ------- ------------------------- ------ |
| MULTISAMPLE_EXT B IsEnabled TRUE Multisample rasterization 13.2.1 |
| enable |
| SAMPLE_ALPHA_TO_ONE_EXT B IsEnabled FALSE Set alpha to max 15.1.3 |
| |
| Errors |
| |
| None |
| |
| Issues |
| |
| 0. What should this extension be named? |
| |
| RESOLVED: EXT_multisample_compatibility. EXT_multisample is a |
| pre-existing extension so we avoid that name. The phrase |
| "compatibility" helps indicate this extension adds nothing not |
| available for years in OpenGL 1.3 (and even before that). |
| |
| 1. Why is this extension necessary? |
| |
| RESOLVED: While OpenGL ES 2.x/3.x support multisampling, they do not |
| provide a way to disable multisampling when rendering to a multisample |
| framebuffer. Conventional OpenGL provides the GL_MULTISAMPLE enable |
| for this purpose. |
| |
| 2. Is disabling multisampling necessary? |
| |
| RESOLVED: Yes, if you are trying to reproduce aliased rendering |
| results in a multisample buffer. |
| |
| Rasterization with multisampling disabled can also provide faster |
| rendering as the rasterization process is simpler and the shading |
| results are more conducive to color compression. |
| |
| NV_framebuffer_mixed_samples relies on being able to disable |
| multisampling to achieve color rate sampling when there is just one |
| color sample per pixel. |
| |
| 3. Should the GL_SAMPLE_ALPHA_TO_ONE_EXT enable be included too? |
| |
| RESOLVED: Yes. OpenGL ES 2.x/3.x lack this enable. While rarely |
| used, this enable is standard in OpenGL 1.3 and on so it can be |
| assumed implementations that support enabling/disabling multisampling |
| can also support this enable too. |
| |
| 4. Should sample shading support ("sample in") for GLSL be introduced |
| by this extension? |
| |
| RESOLVED: No. That support is better left to a different |
| extension as it builds on OES_sample_shading. In fact, |
| OES_shader_multisample_interpolation does this and is included in |
| Android Extension Pack (AEP) and ES 3.2. |
| |
| 5. Do we need to worry that the EXT token names "collide" with the |
| existing tokens of EXT_multisample? |
| |
| RESOLVED: No. GL token names are hex values with capital letters A |
| through F. C allows identical redefinition of #defines with exactly |
| the same lexical string ignoring white space. This means including |
| tokens from a header with EXT_multisample and this extension creates |
| no problem as the tokens have identical token values and names. |
| |
| 6. Direct3D has AlphaToCoverageEnable, but nothing equivalent to |
| GL_SAMPLE_ALPHA_TO_ONE_EXT. Given issue #3, how would Direct3D |
| implement GL_SAMPLE_ALPHA_TO_ONE_EXT? |
| |
| RESOLVED: The GL_SAMPLE_ALPHA_TO_ONE_EXT functionality is included |
| because if the fractional coverage held in the alpha component is |
| transferred to sample mask, leaving the alpha value "as is" would |
| result in "double accounting" for the alpha, once by the sample mask |
| and a second time by any enabled blending based on source alpha. |
| The expectation is if an application uses GL_SAMPLE_ALPHA_TO_COVERAGE |
| and doing blending with source alpha, it should be using |
| GL_SAMPLE_ALPHA_TO_ONE_EXT. |
| |
| While it is odd that Direct3D leaves out the |
| GL_SAMPLE_ALPHA_TO_ONE_EXT functionality from Direct3D, that doesn't |
| undercut the rationale for the functionality nor the compatibility |
| requirement for it if an application uses/needs the functionality. |
| |
| Direct3D can still emulate GL_SAMPLE_ALPHA_TO_COVERAGE and |
| GL_SAMPLE_ALPHA_TO_ONE_EXT both enabled in the shader by computing |
| the sample mask and/or forcing alpha to one in the fragment shader. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- --------- ----------------------------------------- |
| 6 08/25/15 mjk Status updated |
| 5 07/30/15 mjk Comments from Shannon; match language to |
| April 29, 2015 ES 3.1 specification |
| 4 07/09/15 mjk Improve issue 4 |
| 3 07/08/15 mjk Typos |
| 2 05/02/15 mjk Complete |
| 1 04/02/15 mjk Initial revision. |