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
