blob: 52e3b6b680665d2716695f3b4ac605045b972440 [file] [log] [blame]
Name
ANGLE_provoking_vertex
Name Strings
GL_ANGLE_provoking_vertex
Status
Complete
Version
Last Modified Date: Nov 1, 2022
Author Revision: 1
Number
OpenGL ES Extension XX
Dependencies
OpenGL ES 3.0 is required.
This extension is written against the OpenGL ES 3.0 specification.
OES_geometry_shader and EXT_geometry_shader interact with this extension.
Overview
This extension provides an alternative provoking vertex convention
for rendering lines and triangles.
The provoking vertex of a primitive is the vertex that determines the
constant output values when "flat" interpolation qualifier is used.
In OpenGL ES, the provoking vertex for triangle, line, and (trivially)
point primitives is the last vertex used to assemble the primitive.
Alternatively the provoking vertex could be the first vertex of
the primitive. Other APIs have adopted the "first vertex of the
primitive" convention to determine the provoking vertex.
The motivation for this extension is to allow convention-agnostic
applications to have better performance when running on top of layered
implementations of OpenGL ES (such as ANGLE) that use native APIs with
the "first vertex of the primitive" provoking vertex convention.
New Procedures and Functions
void ProvokingVertexANGLE(enum provokeMode);
New Tokens
Accepted by the <provokeMode> parameter of ProvokingVertex:
FIRST_VERTEX_CONVENTION_ANGLE 0x8E4D
LAST_VERTEX_CONVENTION_ANGLE 0x8E4E
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetFloatv, and GetDoublev:
PROVOKING_VERTEX_ANGLE 0x8E4F
Additions to Chapter 2 of the OpenGL ES 3.0 Specification (OpenGL ES Operation)
Modify Section 2.17 "Flatshading"
(replace Table 2.12)
First vertex Last vertex
Primitive type of polygon i convention convention
=========================== ============ =============
point i i
independent line 2i-1 2i
line loop i i+1, if i<n
1, if i==n
line strip i i+1
independent triangle 3i-2 3i
triangle strip i i+2
triangle fan i+1 i+2
line adjacency 4i-2 4i-1
line strip adjacency i+1 i+2
triangle adjacency 6i-5 6i-1
triangle strip adjacency 2i-1 2i+3
Table 2.12: Provoking vertex selection. The output values used for
flatshading the <i>th primitive generated by drawing commands with the
indicated primitive type are derived from the corresponding values of
the vertex whose index is shown in the table. Vertices are numbered 1
through n, where n is the number of vertices drawn.
(add after the second paragraph)
The provoking vertex is controlled with the command
void ProvokingVertexANGLE(enum provokeMode);
<provokeMode> must be either FIRST_VERTEX_CONVENTION_ANGLE or
LAST_VERTEX_CONVENTION_ANGLE, and controls selection of the vertex whose
values are assigned to varying outputs, as shown in Table 2.12.
The state required for flatshading is one bit for the provoking vertex
mode. The initial value of the provoking vertex mode is
LAST_VERTEX_CONVENTION_ANGLE.
Dependencies on OES_geometry_shader, EXT_geometry_shader, and/or the geometry
shader functionality integrated into the core by OpenGL ES 3.2:
If none of OES_geometry_shader, EXT_geometry_shader, or OpenGL ES 3.2
are supported:
* ignore the rows of table 2.12 for line adjacency, line strip
adjacency, triangle adjacency, and triangle strip adjacency.
Errors
INVALID_ENUM is generated when ProvokingVertexANGLE is called with a
<provokeMode> that is not either FIRST_VERTEX_CONVENTION_ANGLE or
LAST_VERTEX_CONVENTION_ANGLE.
New State
(add a new table "Coloring" after the table 6.5)
Get Value Type Get Command Initial Value Description Sec
---------------- ---- ----------- ---------------------------- ---------------- ----
PROVOKING_VERTEX_ANGLE Z2 GetIntegerv LAST_VERTEX_CONVENTION_ANGLE Provoking vertex 2.17
convention
Revision History
11/1/2022 First revision