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 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 : where 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 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.