<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook MathML Module V1.1b1//EN"
              "http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd">
<refentry id="glProvokingVertex">
    <refmeta>
        <refmetainfo>
            <copyright>
                <year>2010</year>
                <holder>Khronos Group</holder>
            </copyright>
        </refmetainfo>
        <refentrytitle>glProvokingVertex</refentrytitle>
        <manvolnum>3G</manvolnum>
    </refmeta>
    <refnamediv>
        <refname>glProvokingVertex</refname>
        <refpurpose>specifiy the vertex to be used as the source of data for flat shaded varyings</refpurpose>
    </refnamediv>
    <refsynopsisdiv><title>C Specification</title>
        <funcsynopsis>
            <funcprototype>
                <funcdef>void <function>glProvokingVertex</function></funcdef>
                <paramdef>GLenum <parameter>provokeMode</parameter></paramdef>
            </funcprototype>
        </funcsynopsis>
    </refsynopsisdiv>
    <!-- eqn: ignoring delim $$ -->
    <refsect1 id="parameters"><title>Parameters</title>
        <variablelist>
        <varlistentry>
            <term><parameter>provokeMode</parameter></term>
            <listitem>
                <para>
                    Specifies the vertex to be used as the source of data for flat shaded varyings.
                </para>
            </listitem>
        </varlistentry>
        </variablelist>
    </refsect1>
    <refsect1 id="description"><title>Description</title>
        <para>
            <emphasis>Flatshading</emphasis> a vertex shader varying output means to assign all vetices of the primitive the same value
            for that output. The vertex from which these values is derived is known as the <emphasis>provoking vertex</emphasis> and
            <function>glProvokingVertex</function> specifies which vertex is to be used as the source of data for flat shaded varyings.
        </para>
        <para>
            <parameter>provokeMode</parameter> must be either <constant>GL_FIRST_VERTEX_CONVENTION</constant> or
            <constant>GL_LAST_VERTEX_CONVENTION</constant>, and controls the selection of the vertex whose values are assigned to flatshaded
            varying outputs. The interpretation of these values for the supported primitive types is:
            <informaltable frame="topbot">
                <tgroup cols="3" align="left">
                    <colspec colwidth="1.1*" />
                    <colspec colwidth="1*" />
                    <colspec colwidth="1*" />
                    <thead>
                        <row>
                            <entry rowsep="1" align="left"><emphasis role="bold">
                            Primitive Type of Polygon <emphasis>i</emphasis>
                            </emphasis></entry>
                            <entry rowsep="1" align="left"><emphasis role="bold">
                            First Vertex Convention
                            </emphasis></entry>
                            <entry rowsep="1" align="left"><emphasis role="bold">
                            Last Vertex Convention
                            </emphasis></entry>
                        </row>
                        <row>
                            <entry>
                                point
                            </entry>
                            <entry>
                                <emphasis>i</emphasis>
                            </entry>
                            <entry>
                                <emphasis>i</emphasis>
                            </entry>
                        </row>
                        <row>
                            <entry>
                                independent line
                            </entry>
                            <entry>
                                2<emphasis>i</emphasis> - 1
                            </entry>
                            <entry>
                                2<emphasis>i</emphasis>
                            </entry>
                        </row>
                        <row>
                            <entry>
                                line loop
                            </entry>
                            <entry>
                                <emphasis>i</emphasis>
                            </entry>
                            <entry>
                                <para>
                                <emphasis>i</emphasis> + 1, if <emphasis>i</emphasis> &lt; <emphasis>n</emphasis>
                                </para>
                                <para>
                                1, if <emphasis>i</emphasis> = <emphasis>n</emphasis>
                                </para>
                            </entry>
                        </row>
                        <row>
                            <entry>
                                line strip
                            </entry>
                            <entry>
                                <emphasis>i</emphasis>
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 1
                            </entry>
                        </row>
                        <row>
                            <entry>
                                independent triangle
                            </entry>
                            <entry>
                                3<emphasis>i</emphasis> - 2
                            </entry>
                            <entry>
                                3<emphasis>i</emphasis>
                            </entry>
                        </row>
                        <row>
                            <entry>
                                triangle strip
                            </entry>
                            <entry>
                                <emphasis>i</emphasis>
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 2
                            </entry>
                        </row>
                        <row>
                            <entry>
                                triangle fan
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 1
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 2
                            </entry>
                        </row>
                        <row>
                            <entry>
                                line adjacency
                            </entry>
                            <entry>
                                4<emphasis>i</emphasis> - 2
                            </entry>
                            <entry>
                                4<emphasis>i</emphasis> - 1
                            </entry>
                        </row>
                        <row>
                            <entry>
                                line strip adjacency
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 1
                            </entry>
                            <entry>
                                <emphasis>i</emphasis> + 2
                            </entry>
                        </row>
                        <row>
                            <entry>
                                triangle adjacency
                            </entry>
                            <entry>
                                6<emphasis>i</emphasis> - 5
                            </entry>
                            <entry>
                                6<emphasis>i</emphasis> - 1
                            </entry>
                        </row>
                        <row>
                            <entry>
                                triangle strip adjacency
                            </entry>
                            <entry>
                                2<emphasis>i</emphasis> - 1
                            </entry>
                            <entry>
                                2<emphasis>i</emphasis> + 3
                            </entry>
                        </row>
                    </thead>
                </tgroup>
            </informaltable>
        </para>
        <para>
            If a vertex or geometry shader is active, user-defined varying outputs may be flatshaded by using the
            <code>flat</code> qualifier when declaring the output.
        </para>
    </refsect1>
    <refsect1 id="notes"><title>Notes</title>
        <para>
            <function>glProvokingVertex</function> is available only if the GL version is 3.2 or greater.
        </para>
    </refsect1>
    <refsect1 id="errors"><title>Errors</title>
        <para>
            <constant>GL_INVALID_ENUM</constant> is generated if <parameter>provokeMode</parameter> is not an accepted value.
        </para>
    </refsect1>
    <refsect1 id="Copyright"><title>Copyright</title>
        <para>
            Copyright <trademark class="copyright"></trademark> 2010 Khronos Group. 
            This material may be distributed subject to the terms and conditions set forth in 
            the Open Publication License, v 1.0, 8 June 1999.
            <ulink url="http://opencontent.org/openpub/">http://opencontent.org/openpub/</ulink>.
        </para>
    </refsect1>
</refentry>
