skia / external / github.com / KhronosGroup / OpenGL-Registry / refs/heads/11723-workgroup / . / extensions / NV / NV_shader_noperspective_interpolation.txt

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