| Name | 
 |  | 
 |     NV_shader_noperspective_interpolation | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_NV_shader_noperspective_interpolation | 
 |  | 
 | Contact | 
 |  | 
 |     Daniel Koch, NVIDIA (dkoch 'at' nvidia.com) | 
 |  | 
 | Contributors | 
 |  | 
 |     Pat Brown, NVIDIA | 
 |     Michael Chock, NVIDIA | 
 |  | 
 | Status | 
 |  | 
 |     Complete | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date: October 24, 2014 | 
 |     Revision: 2 | 
 |  | 
 | Number | 
 |  | 
 |     OpenGL ES Extension #201 | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL ES 3.0 and GLSL ES 3.00 are required. | 
 |  | 
 |     This specification is written against the OpenGL ES 3.1 (March 17, | 
 |     2014) and OpenGL ES 3.10 Shading Language (May 14, 2014) specifications. | 
 |  | 
 |     This extension interacts with OES_shader_multisample_interpolation. | 
 |  | 
 |     This extension trivially interacts with EXT_geometry_shader. | 
 |  | 
 |     This extension trivially interacts with EXT_tessellation_shader. | 
 |  | 
 | Overview | 
 |  | 
 |     In OpenGL 3.0 and later, and in other APIs, there are three types of | 
 |     interpolation qualifiers that are available for fragment shader inputs: | 
 |     flat, smooth, and noperspective.  The 'flat' qualifier indicates that no | 
 |     interpolation should be used. This is mandatory for integer-type | 
 |     variables. The 'smooth' qualifier indicates that interpolation should be | 
 |     performed in a perspective0correct manner. This is the default for | 
 |     floating-point type variables.  The 'noperspective' qualifier indicates | 
 |     that interpolation should be performed linearly in screen space. | 
 |  | 
 |     While perspective-correct (smooth) and non-interpolated (flat) are the | 
 |     two types of interpolation that most commonly used, there are important | 
 |     use cases for linear (noperspective) interpolation.  In particular, in | 
 |     some work loads where screen-space aligned geometry is common, the use of | 
 |     linear interpolation can result in performance and/or power improvements. | 
 |  | 
 |     The smooth and flat interpolation qualifiers are already supported in | 
 |     OpenGL ES 3.0 and later. This extension adds support for noperspective | 
 |     interpolation to OpenGL ES. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None. | 
 |  | 
 | New Tokens | 
 |  | 
 |     None. | 
 |  | 
 | Additions to the OpenGL ES 3.1 Specification | 
 |  | 
 |     Modifications to Section 12.4.1 (Clipping Shader Outputs) | 
 |  | 
 |     (Insert a new paragraph as the second-to-last paragraph of the section) | 
 |  | 
 |     For vertex shader outputs specified to be interpolated without | 
 |     perspective correction (using the "noperspective" qualifier), the value | 
 |     of <t> used to obtain the output value associated with P will be adjusted | 
 |     to produce results that vary linearly in screen space. | 
 |  | 
 |  | 
 |     Modifications to Section 13.4.1 (Basic Line Segment Rasterization) | 
 |  | 
 |     (Replace the last paragraph of the section with the following language | 
 |     which adds in the description of noperspective interpolation) | 
 |  | 
 |     The "noperspective" and "flat" keywords used to declare shader outputs | 
 |     affect how they are interpolated.  When neither keyword is specified, | 
 |     interpolation is performed as described in equation 13.4.  When the | 
 |     "noperspective" keyword is specified, interpolation is performed in the | 
 |     same fashion as for depth values, as described in equation 13.5.  When | 
 |     the "flat" keyword is specified, no interpolation is performed, and | 
 |     outputs are taken from the corresponding input value of the provoking | 
 |     vertex corresponding to that primitive (see section 12.3). | 
 |  | 
 |  | 
 |     Modifications to Section 13.5.1 (Basic Polygon Rasterization) | 
 |  | 
 |     (Replace the paragraph which describes the interpolation keywords in | 
 |     the middle of p. 298) | 
 |  | 
 |     The "noperspective" and "flat" keywords used to declare shader outputs | 
 |     affect how they are interpolated.  When neither keyword is specified, | 
 |     interpolation is performed as described in equation 13.7.  When the | 
 |     "noperspective" keyword is specified, interpolation is performed in the | 
 |     same fashion as for depth values, as described in equation 13.8. When | 
 |     the "flat" keyword is specified, no interpolation is performed, and | 
 |     outputs are taken from the corresponding input value of the provoking | 
 |     vertex corresponding to that primitive (see section 12.3). | 
 |  | 
 |  | 
 |     Modifications to Section 13.5.3 (Polygon Multisample Rasterization) | 
 |  | 
 |     (replace the last paragraph of the section) | 
 |  | 
 |     The "noperspective" and "flat" qualifiers affect how shader outputs are | 
 |     interpolated in the same fashion as described for basic polygon | 
 |     rasterization in section 13.5.1. | 
 |  | 
 | Dependencies on OES_shader_multisample_interpolation | 
 |  | 
 |     If OES_shader_multisample_interpolation is not supported, ignore | 
 |     references to the interpolation functions in section 8.13. | 
 |  | 
 | Dependencies on EXT_geometry_shader | 
 |  | 
 |     If EXT_geometry_shader is supported the, noperspective keyword | 
 |     can be used on the outputs from geometry shaders. | 
 |  | 
 |     If EXT_geometry_shader is not support, ignore references to | 
 |     geometry shaders. | 
 |  | 
 | Dependencies on EXT_tessellation_shader | 
 |  | 
 |     If EXT_tessellation_shader is supported, the noperspective keyword | 
 |     can be used on the outputs from tessellation shaders. | 
 |  | 
 |     If EXT_tessellation_shader is not support, ignore references to | 
 |     tessellation shaders. | 
 |  | 
 | New State | 
 |  | 
 |     None. | 
 |  | 
 | Additions to the OpenGL ES Shading Language 3.10 Specification | 
 |  | 
 |     Including the following line in a shader can be used to control the | 
 |     language features described in this extension: | 
 |  | 
 |       #extension GL_NV_shader_noperspective_interpolation : <behavior> | 
 |  | 
 |     where <behavior> is as specified in section 3.4. | 
 |  | 
 |     A new preprocessor #define is added to the OpenGL ES Shading Language: | 
 |  | 
 |       #define GL_NV_shader_noperspective_interpolation 1 | 
 |  | 
 |  | 
 |     Modifications to Section 3.6 (Keywords): | 
 |  | 
 |     Remove "noperspective" from the list of reserved keywords and add it to | 
 |     the list of keywords. | 
 |  | 
 |  | 
 |     Modifications to Section 4.3 (Storage Qualifiers): | 
 |  | 
 |     (Add to the table of interpolation qualifiers) | 
 |  | 
 |     Qualifier          Meaning | 
 |     ---------          ------- | 
 |     noperspective      linear interpolation | 
 |  | 
 |  | 
 |     Modifications to Section 4.3.4 (Input Variables): | 
 |  | 
 |     (Add to the list of fragment input examples:) | 
 |  | 
 |         noperspective in float temperature; | 
 |         noperspective centroid in vec2 myTexCoord; | 
 |  | 
 |  | 
 |     Modifications to Section 4.3.6 (Output Variables): | 
 |  | 
 |     (Add to the list of vertex (or tessellation or geometry) output examples:) | 
 |  | 
 |         noperspective out float temperature; | 
 |         noperspective centroid out vec2 myTexCoord; | 
 |  | 
 |  | 
 |     Modifications to Section 4.5 (Interpolation Qualifiers): | 
 |  | 
 |     (Add to the table of interpolation qualifiers:) | 
 |  | 
 |     Qualifier          Meaning | 
 |     ---------          ------- | 
 |     noperspective      linear interpolation | 
 |  | 
 |     (Following the description of "smooth" add the following description:) | 
 |  | 
 |     "A variable qualified as "noperspective" must be interpolated linearly | 
 |     in screen space as described in equation 13.5 of the OpenGL ES Graphics | 
 |     System Specification, section 13.4 "Line Segments". | 
 |  | 
 |  | 
 |     Modifications to Section 8.13 (Fragment Processing Functions), as modified | 
 |     by OES_shader_multisample_interpolation: | 
 |  | 
 |     (Add to the end of the paragraph describing the interpolation functions) | 
 |  | 
 |     "For all the interpolation functions ... | 
 |     If <interpolant> is declared with the "noperspective" qualifier, the | 
 |     interpolated value will be computed without perspective correction." | 
 |  | 
 |  | 
 |     Modifications to Section 9 (Shading Language Grammar) | 
 |  | 
 |     (Add to the list of tokens returned from lexical analysis) | 
 |  | 
 |     NOPERSPECTIVE | 
 |  | 
 |     (update the interpolation_qualifier rule to be) | 
 |  | 
 |     interpolation_qualifier: | 
 |         SMOOTH | 
 |         FLAT | 
 |         NOPERSPECTIVE | 
 |  | 
 |  | 
 | Issues | 
 |  | 
 |     (1) Is this any different from the 'noperspective' functionality | 
 |     that was added in OpenGL 3.0? | 
 |  | 
 |     RESOLVED. No. This is intended to be identical and the language used | 
 |     for this specification was based on the deltas between GL 4.4 and | 
 |     ES 3.1. | 
 |  | 
 |     (2) What should we call this extension? | 
 |  | 
 |     RESOLVED: Options considered included: | 
 |      - shader_interpolation_noperspective | 
 |      - shader_noperspective_interpolation | 
 |     Using the second option as this is consistent with the naming of | 
 |     OES_shader_multisample_interpolation which added support for | 
 |     per-sample interpolation. | 
 |  | 
 |     (3) This is a small extension. Is there anything else we should add at | 
 |     the same time? | 
 |  | 
 |     RESOLVED. No. All the other related functionality is supported in ES | 
 |     or already has an extension. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date    Author    Changes | 
 |     ----  --------  --------- ------------------------------------------------- | 
 |       1   06/05/14  dkoch     Initial draft based on GL 4.4 and GLSL 4.40 | 
 |       2   10/24/14  dkoch     Mark complete, resolve issue. |