| Name | 
 |  | 
 |     ARB_shader_stencil_export | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_shader_stencil_export | 
 |  | 
 | Contributors | 
 |  | 
 |     Graham Sellers, AMD | 
 |     Andrew Lewycky, AMD | 
 |     Mais Alnasser, AMD | 
 |  | 
 | Contact | 
 |  | 
 |     Graham Sellers, AMD (graham.sellers 'at' amd.com) | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2010-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Specification Update Policy | 
 |  | 
 |     Khronos-approved extension specifications are updated in response to | 
 |     issues and bugs prioritized by the Khronos OpenGL Working Group. For | 
 |     extensions which have been promoted to a core Specification, fixes will | 
 |     first appear in the latest version of that core Specification, and will | 
 |     eventually be backported to the extension document. This policy is | 
 |     described in more detail at | 
 |         https://www.khronos.org/registry/OpenGL/docs/update_policy.php | 
 |  | 
 | Status | 
 |  | 
 |     Complete. Approved by the ARB on June 9, 2010. | 
 |     Approved by the Khronos Board of Promoters on July 23, 2010. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:         05/20/2010 | 
 |     Author Revision:            6 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #106 | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL 1.0 is required. | 
 |  | 
 |     ARB_fragment_shader is required. | 
 |  | 
 |     This extension is written against the OpenGL Shading Language Specification | 
 |     version 1.40.05 | 
 |  | 
 | Overview | 
 |  | 
 |     In OpenGL, the stencil test is a powerful mechanism to selectively discard | 
 |     fragments based on the content of the stencil buffer. However, facilites | 
 |     to update the content of the stencil buffer are limited to operations such | 
 |     as incrementing the existing value, or overwriting with a fixed reference | 
 |     value. | 
 |  | 
 |     This extension provides a mechanism whereby a shader may generate the | 
 |     stencil reference value per invocation. When stencil testing is enabled, | 
 |     this allows the test to be performed against the value generated in the | 
 |     shader. When the stencil operation is set to GL_REPLACE, this allows a | 
 |     value generated in the shader to be written to the stencil buffer directly. | 
 |  | 
 | IP Status | 
 |  | 
 |     No known IP claims. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None. | 
 |  | 
 | New Tokens | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 2.1 Specification (OpenGL Operation) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment Operations | 
 | and the Framebuffer) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 2.1 Specification (Special | 
 | Functions) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 2.1 Specification (State and | 
 | State Requests) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to the OpenGL Shading Language Version 1.40.05 | 
 |  | 
 |     Add a new Section 3.3.x, GL_ARB_shader_stencil_export Extension (p. 11) | 
 |  | 
 |     3.3.x GL_ARB_shader_stencil_export | 
 |  | 
 |     To use the GL_ARB_shader_stencil_export extension in a shader it must be | 
 |     enabled using the #extension directive. | 
 |  | 
 |     The shading language preprocessor #define GL_ARB_shader_stencil_export will | 
 |     be defined to 1 if the GL_ARB_shader_stencil_export extension is supported. | 
 |  | 
 |     Modify Section 7.2, "Fragment Shader Special Variables": | 
 |  | 
 |     Add to the list of built-in special variables, p.63: | 
 |  | 
 |         out int gl_FragStencilRefARB; | 
 |  | 
 |     Modify the paragraph beginning, "Fragment shaders output values to the | 
 |     OpenGL pipeline..." to: | 
 |  | 
 |     Fragment shaders output values to the OpenGL pipeline using the built-in | 
 |     variables gl_FragColor, gl_FragData, gl_FragDepth, and gl_FragStencilRefARB | 
 |     unless the discard statement is executed. Both gl_FragColor and gl_FragData | 
 |     are deprecated; the preferred usage is to explicitly declare these outputs | 
 |     in the fragment shader using the out storage qualifier. | 
 |  | 
 |     Insert a new paragraph after the paragraph describing gl_FragDepth: | 
 |  | 
 |     Writing to gl_FragStencilRefARB will establish the stencil reference value | 
 |     for the fragment being processed. Only the least significant bits of the | 
 |     integer gl_FragStencilRefARB are considered up to the value of STENCIL_BITS | 
 |     and higher order bits are discarded. If stencil testing is enabled and no | 
 |     shader writes to gl_FragStencilRefARB, then the fixed function value for | 
 |     stencil reference will be used as the fragment's stencil reference value. | 
 |     If a shader statically assignes a value to gl_FragStencilRefARB, and there | 
 |     is an execution path through the shader that does not set | 
 |     gl_FragStencilRefARB, then the value of the fragment's stencil reference | 
 |     value may be undefined for executions of the shader that take that path. | 
 |     That is, if the set of linked shaders statically contain a write to | 
 |     gl_FragStencilRefARB, then it is responsible for always writing it. | 
 |  | 
 |     Modify the first paragraph on p.64: | 
 |  | 
 |     If a shader executes the discard keyword, the fragment is discarded, and | 
 |     the values of any user-defined fragment outputs, gl_FragDepth, gl_FragColor, | 
 |     gl_FragData, and gl_FragStencilRefARB become irrelevant. | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None. | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     None. | 
 |  | 
 | Errors | 
 |  | 
 |     None. | 
 |  | 
 | New State | 
 |  | 
 |     None. | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None. | 
 |  | 
 | Issues | 
 |  | 
 |     1) Should gl_FragStencilRefARB be initialized to the current stencil | 
 |        reference value on input to the fragment shader? | 
 |  | 
 |        RESOLVED: No. gl_FragStencilRefARB is write-only. If the current stencil | 
 |        reference value is required in a shader, the application should place | 
 |        it in a uniform. | 
 |  | 
 |     2) Is it possible to output the stencil mask from the shader? | 
 |  | 
 |        RESOLVED: No. | 
 |  | 
 |     3) Is the global stencil mask still applied? | 
 |  | 
 |        RESOLVED: Yes. The mask is global as there is no way to export the | 
 |        stencil mask from the shader. | 
 |  | 
 |     4) How is two-sided stencil handled? How do we export front and back | 
 |        stencil references? | 
 |  | 
 |        RESOLVED: There is only one export from the shader. However, two sided | 
 |        stencil reference generation may be achived as: | 
 |  | 
 |           if (gl_FrontFacing) | 
 |             gl_FragStencilRefARB = foo; | 
 |           else | 
 |             gl_FragStencilRefARB = bar; | 
 |  | 
 |        If both front and back stencil reference values are needed in a single | 
 |        shader, user defined uniforms may be used. | 
 |  | 
 |     5) If the value written to gl_FragStencilRefARB is outside of the range of | 
 |        values representable by the stencil buffer, what happens? | 
 |  | 
 |        RESOLVED: The additional bits are discarded. This is logical as the | 
 |        stencil mask is still applied and its bit-depth is that of the stencil | 
 |        buffer. If clamping is desired, this should be performed in the shader. | 
 |  | 
 |     6) Why is gl_FragStencilRef signed? | 
 |  | 
 |        For consistency with the ref parameter to glStencilFunc, which is a | 
 |        GLint. It is masked with the stencil mask value, so it makes no practical | 
 |        difference whether it's signed or unsigned unless the implementation | 
 |        supports 32-bit stencil buffers. An interesting note is that the GL | 
 |        specification states that the comparison made in the stencil test | 
 |        is unsigned. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date      Author    Changes | 
 |     ----  --------    --------  ----------------------------------------- | 
 |  | 
 |      6    05/20/2010  gsellers  Add issue 6. | 
 |      5    04/07/2010  gsellers  Remove erroneous language stating that | 
 |                                 gl_FragStencilRefARB is initialized to the fixed | 
 |                                 function reference value. | 
 |      4    09/27/2009  gsellers  Update issues 1, 4 and 5. | 
 |      3    07/16/2009  gsellers  Address two-sided stencil references. | 
 |                                 Add issues 3, 4 and 5. | 
 |      2    07/14/2009  gsellers  Add ARB suffix to gl_FragStencilRef. Resolve (1) | 
 |      1    07/10/2009  gsellers  Initial draft. |