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.