| Name |
| |
| NV_fragment_shader_barycentric |
| |
| Name Strings |
| |
| GL_NV_fragment_shader_barycentric |
| |
| Contact |
| |
| Pat Brown, NVIDIA (pbrown 'at' nvidia.com) |
| |
| Contributors |
| |
| Ashwin Lele, NVIDIA |
| Jeff Bolz, NVIDIA |
| |
| Status |
| |
| Shipping |
| |
| Version |
| |
| Last Modified: September 15, 2018 |
| Revision: 1 |
| |
| Number |
| |
| OpenGL Extension #526 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.6 Specification |
| (Compatibility Profile), dated July 30, 2017. |
| |
| OpenGL 4.5 is required. |
| |
| This extension requires support for the OpenGL Shading Language (GLSL) |
| extension "NV_fragment_shader_barycentric", which can be found at the |
| Khronos Group Github site here: |
| |
| https://github.com/KhronosGroup/GLSL |
| |
| Overview |
| |
| This extension advertises OpenGL support for the OpenGL Shading Language |
| (GLSL) extension "NV_fragment_shader_barycentric", which provides fragment |
| shader built-in variables holding barycentric weight vectors that identify |
| the location of the fragment within its primitive. Additionally, the GLSL |
| extension allows fragment the ability to read raw attribute values for |
| each of the vertices of the primitive that produced the fragment. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| None |
| |
| Modifications to the OpenGL 4.6 Specification (Compatibility Profile) |
| |
| Modify Section 15.2.2, Shader Inputs (p. 586) |
| |
| (insert new paragraphs after the first paragraph, p. 589) |
| |
| Fragment shader input variables can be declared as per-vertex inputs using |
| the GLSL interpolation qualifier "pervertexNV". Such inputs are not |
| produced by attribute interpolation, but are instead taken directly from |
| corresponding output variables written by the previous shader stage, prior |
| to primitive clipping and rasterization. When reading per-vertex inputs, |
| a fragment shader specifies a vertex number (0, 1, or 2) that identifies a |
| specific vertex in the point, line, or triangle primitive that produced |
| the vertex. |
| |
| When no tessellation or geometry shader is active, the vertices passed to |
| each draw call are arranged into point, line, or triangle primitives as |
| described in Section 10.1. If the <n> vertices passed to a draw call are |
| numbered 0 through <n>-1, and the point, line, and triangle primitives |
| produced by the draw call are numbered with consecutive integers beginning |
| with zero, Table X.1 and Table X.2 indicate the original vertex numbers |
| used as vertex 0, vertex 1, and vertex 2 when sourcing per-vertex |
| attributes for fragments produced by the primitive numbered <i>. Table |
| X.1 applies when the provoking vertex convention is |
| FIRST_VERTEX_CONVENTION, while Table X.2 applies when the provoking vertex |
| convention is LAST_VERTEX_CONVENTION. |
| |
| Primitive Type Vertex 0 Vertex 1 Vertex 2 |
| ------------------------ -------- -------- -------- |
| POINTS i - - |
| LINES 2i 2i+1 - |
| LINE_STRIP i i+1 - |
| LINE_LOOP i i+1 - |
| LINE_LOOP (last segment) n-1 0 - |
| TRIANGLES 3i 3i+1 3i+2 |
| TRIANGLE_STRIP (even) i i+1 i+2 |
| TRIANGLE_STRIP (odd) i i+2 i+1 |
| TRIANGLE_FAN i+1 i+2 0 |
| POLYGON 0 i i+1 |
| LINES_ADJACENCY 4i+1 4i+2 - |
| LINES_STRIP_ADJACENCY i+1 i+2 - |
| TRIANGLES_ADJACENCY 6i 6i+2 6i+4 |
| TRIANGLE_STRIP_ADJACENCY (even) 2i 2i+2 2i+4 |
| TRIANGLE_STRIP_ADJACENCY (odd) 2i 2i+4 2i+2 |
| |
| Table X.1, Vertex Order for per-vertex attributes, using the provoking |
| vertex convention FIRST_VERTEX_CONVENTION. |
| |
| Primitive Type Vertex 0 Vertex 1 Vertex 2 |
| ------------------------ -------- -------- -------- |
| POINTS i - - |
| LINES 2i 2i+1 - |
| LINE_STRIP i i+1 - |
| LINE_LOOP i i+1 - |
| LINE_LOOP (last segment) n-1 0 - |
| TRIANGLES 3i 3i+1 3i+2 |
| TRIANGLE_STRIP (even) i i+1 i+2 |
| TRIANGLE_STRIP (odd) i+1 i i+2 |
| TRIANGLE_FAN 0 i+1 i+2 |
| POLYGON 0 i i+1 |
| LINES_ADJACENCY 4i+1 4i+2 |
| LINES_STRIP_ADJACENCY i+1 i+2 |
| TRIANGLES_ADJACENCY 6i 6i+2 6i+4 |
| TRIANGLE_STRIP_ADJACENCY (even) 2i 2i+2 2i+4 |
| TRIANGLE_STRIP_ADJACENCY (odd) 2i+2 2i 2i+4 |
| |
| Table X.2, Vertex Order for per-vertex attributes, using the provoking |
| vertex convention LAST_VERTEX_CONVENTION. |
| |
| When using geometry shaders, vertices used for per-vertex fragment shader |
| inputs are determined using Table X.1 or X.2 by treating the primitive(s) |
| produced by the geometry shader as though they were passed to a DrawArrays |
| calls. When using a tessellation evaluation shader, or when using QUADS |
| or QUAD_STRIP primitives, the vertices used for reading per-vertex |
| fragment shader inputs are assigned in an implementation-dependent order. |
| |
| The built-in variables gl_BaryCoordNV and gl_BaryCoordNoPerspNV are |
| three-component floating-point vectors holding barycentric coordinates for |
| the fragment. These built-ins are computed by clipping (Section 13.6.1) |
| and interpolating (Sections 14.5.1 and 14.6.1) a three-component vector |
| attribute. The vertices that are numbered 0, 1, and 2 for the purposes of |
| reading per-vertex fragment shader inputs are assigned values of (1,0,0), |
| (0,1,0), and (0,0,1), respectively. For gl_BaryCoordNV, these values are |
| clipped and interpolated using perspective correction. For |
| gl_BaryCoordNoPerspNV, these values are clipped and interpolated without |
| perspective correction, like other fragment shader inputs qualified with |
| "noperspective". |
| |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| None |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| (1) Can applications use the original order of vertices in a draw call to |
| determine the order of the three vertices used when reading per-vertex |
| fragment shader inputs? |
| |
| RESOLVED: Yes, in most cases. |
| |
| This extension allows fragment shaders to read inputs qualified with |
| "pervertexNV" using a vertex number 0, 1, or 2. For most primitive |
| types, the OpenGL Specification already specifies how the original |
| vertices passed to a draw call are assigned to individual point, line, |
| or triangle primitives. The extension extends that language to define a |
| specific vertex order that will be used for sourcing per-vertex |
| attributes. In some cases, this vertex order depends on the provoking |
| vertex convention. |
| |
| When using a tessellation evaluation shader, QUADS primitives, or |
| QUAD_STRIP primitives, the OpenGL Specification already indicates that |
| patches or quadrilaterals can be decomposed into finer primitives in an |
| implementation-dependent order. In these cases, we do not guarantee a |
| specific vertex order. However, we still guarantee that the vertices |
| numbered 0, 1, 2 have corresponding barycentric weights (gl_BaryCoordNV) |
| of (1,0,0), (0,1,0), and (0,0,1), respectively. With this guarantee, |
| interpolating attributes manually in a fragment shader with code like: |
| |
| float value = (gl_BaryCoordNV.x * v[0].attrib + |
| gl_BaryCoordNV.y * v[1].attrib + |
| gl_BaryCoordNV.z * v[2].attrib); |
| |
| should produce results approximately equal to those that would be |
| obtained via conventional attribute interpolation. |
| |
| (2) How are clipped primitives handled when using "pervertexNV" |
| fragment shader inputs? |
| |
| RESOLVED: In the OpenGL pipeline, clipped primitives are normally |
| handled by having the clipper remove one of the original vertices, |
| introduce one or more new vertices, and process the result as an |
| unclipped primitive. In this model, the provoking vertex still needs to |
| be maintained because inputs qualified with "flat" use the values from |
| that vertex even if the provoking vertex is clipped. |
| |
| In this extension, we guarantee that the three sets of per-vertex values |
| available as fragment shader inputs are those of the original primitive |
| vertices prior to clipping. To ensure consistent attribute handling, |
| the barycentric weights are computed relative to the original primitive, |
| not the clipped one. For example, if the left half of triangle ABC |
| below is clipped away, the clipper introduces a new vertex D and |
| rasterizes triangle DBC instead. |
| |
| + B (0,1,0) |
| /|\ |
| / | \ |
| / | \ |
| / | \ |
| / | \ |
| / | \ |
| (1,0,0) A +------+------+ C (0,0,1) |
| D |
| |
| When we process the clipped triangle, the three vertices available for |
| "pervertexNV" inputs are actually A, B, and C (in undefined order). |
| If vertices "v[0]", "v[1]", and "v[2]" are assigned to A, B, and C, |
| respectively, fragments at A, B, and C will have barycentric coordinates |
| of (1,0,0), (0,1,0), and (0,0,1), respectively. A fragment at the |
| vertex D introduced by the clipper will have a weight like (0.5, 0.0, |
| 0.5) -- exactly the same value it would have if ABC were unclipped. |
| |
| (3) Should we have any program interface query API support where |
| application code can inspect the active fragment shader inputs and |
| determine which ones were declared with "pervertexNV"? |
| |
| RESOLVED: No. We don't have this for other interpolation qualifiers |
| like "flat" or "noperspective". |
| |
| Also, please refer to issues in the GLSL extension specification. |
| |
| Revision History |
| |
| Revision 1 (pbrown) |
| - Internal revisions. |