Name

    NV_polygon_mode

Name Strings

    GL_NV_polygon_mode

Contact

    James Helferty, NVIDIA Corporation (jhelferty 'at' nvidia.com)

Contributors

    James Helferty, NVIDIA Corporation
    Daniel Koch, NVIDIA Corporation

Status

    Complete

Version

    Last Modified Date:         Sept 11, 2014
    Revision:                   1

Number

    OpenGL ES Extension #238

Dependencies

    This extension is written against the OpenGL ES 3.1 (June 4, 2014)
    specification, but can apply to earlier versions.

    This extension trivially interacts with NV_draw_texture

Overview

    This extension adds a PolygonModeNV entry point which can be used to change
    the polygon rasterization method. Using this extension, state consistent
    with rendering triangle primitives can trivially be toggled to render
    primitives as lines or points. In addition, independent enables are
    provided for polygon offset in conjunction with these new point and line
    polygon modes.

    This introduces a level of support for PolygonMode comparable with the
    OpenGL 4.3 core profile.

New Procedures and Functions

    void PolygonModeNV(enum face, enum mode);

New Tokens

    Accepted by the <pname> parameter to GetIntegerv:

        POLYGON_MODE_NV                             0x0B40

    Accepted by the <pname> parameter to IsEnabled:

        POLYGON_OFFSET_POINT_NV                     0x2A01
        POLYGON_OFFSET_LINE_NV                      0x2A02

    Returned by GetIntegerv, GetFloatv, and GetInteger64v when <pname> is
    POLYGON_MODE_NV:

        POINT_NV                                    0x1B00
        LINE_NV                                     0x1B01
        FILL_NV                                     0x1B02

Additions to Chapter 13 of the OpenGL 3.1 Specification (Fixed-Function
Primitive Assembly and Rasterization)

    Insert new section 13.5.1pm, "Options Controlling Polygon Rasterization"
    between section 13.5.1 and 13.5.2:

    The interpretation of polygons for rasterization is controlled using

        void PolygonModeNV( enum face, enum mode );

    <face> must be FRONT_AND_BACK, indicating that the rasterizing method
    described by <mode> replaces the rasterizing method for both front- and
    back-facing polygons. <mode> is one of the symbolic constants POINT_NV,
    LINE_NV, or FILL_NV. Calling PolygonModeNV with POINT_NV causes the
    vertices of a polygon to be treated, for rasterization purposes, as if they
    had been drawn with <mode> POINTS. LINE_NV causes edges to be rasterized as
    line segments. FILL_NV is the default mode of polygon rasterization,
    corresponding to the description in section 13.5.1.  Note that these modes
    affect only the final rasterization of polygons: in particular, a polygon's
    vertices are lit, and the polygon is clipped and possibly culled before
    these modes are applied.

    Modify Section 13.5.2, "Depth Offset" as follows:

    Replace the second-last paragraph that begins "Boolean state value
    POLYGON_OFFSET_FILL determines whether <o> is applied during the
    rasterization of polygons..." with:

    Boolean state values POLYGON_OFFSET_POINT_NV, POLYGON_OFFSET_LINE_NV, and
    POLYGON_OFFSET_FILL determine whether <o> is applied during the
    rasterization of polygons in POINT_NV, LINE_NV, and FILL_NV modes. These
    boolean state values are enabled and disabled as argument values to the
    commands Enable and Disable.  If POLYGON_OFFSET_POINT_NV is enabled, <o> is
    added to the depth value of each fragment produced by the rasterization of
    a polygon in POINT_NV mode.  Likewise, if POLYGON_OFFSET_LINE_NV or
    POLYGON_OFFSET_FILL is enabled, <o> is added to the depth value of each
    fragment produced by the rasterization of a polygon in LINE_NV or FILL_NV
    modes, respectively.

    Modify Section 13.5.3, "Polygon Multisample Rasterization" as follows:

    Append the paragraph:

    The rasterization described above applies only to the FILL_NV state of
    PolygonModeNV. For POINT_NV and LINE_NV, the rasterizations described in
    sections 13.3.2 (Point Multisample Rasterization) and 13.4.4 (Line
    Multisample Rasterization) apply.

    Modify Section 13.5.4 "Polygon Rasterization State"

    The state required for polygon rasterization consists of whether point,
    line, and fill mode polygon offsets are enabled or disabled, and the factor
    and bias values of the polygon offset equation. The initial polygon offset
    factor and bias values are both 0; initially polygon offset is disabled for
    all modes. The initial state for PolygonModeNV is FILL_NV.

Additions to Chapter 15 of the OpenGL 3.1 Specification (Writing Fragments and
Samples to the Framebuffer)

    Modify Section 15.1.4, "Stencil Test" as follows:

    Replace the third paragraph with:

    There are two sets of stencil-related state, the front stencil state set
    and the back stencil state set. Stencil tests and writes use the front set
    of stencil state when processing fragments rasterized from non-polygon
    primitives (points and lines) and front-facing polygon primitives while the
    back set of stencil state is used when processing fragments rasterized from
    back-facing polygon primitives. For the purposes of stencil testing, a
    primitive is still considered a polygon even if the polygon is to be
    rasterized as points or lines due to the current polygon mode. Whether a
    polygon is front- or back-facing is determined in the same manner used for
    face culling (see section 13.5.1).

Interactions with NV_draw_texture

    In NV_draw_texture, change references to PolygonMode to PolygonModeNV, and
    disregard the interaction ignoring PolygonMode for ES.

New State

    Modify Table 20.6, Rasterization

    Add:

                                          Initial
    Get Value               Type Get Command  Value  Description                  Sec.
    ----------------------- ---- ----------- ------- --------------------------- ------
    POLYGON_MODE_NV          E   GetIntegerv FILL_NV Polygon rasterization mode  13.5.1pm
                                                     (front & back)
    POLYGON_OFFSET_POINT_NV  B   IsEnabled   FALSE   Polygon offset enable for   13.5.2
                                                     POINT_NV mode rasterization
    POLYGON_OFFSET_LINE_NV   B   IsEnabled   FALSE   Polygon offset enable for   13.5.2
                                                     LINE_NV mode rasterization

    Change description for POLYGON_OFFSET_FILL to "Polygon offset enable for
    FILL_NV mode rasterization"

Errors

    An INVALID_ENUM error is generated by PolygonModeNV if <face> is not
    FRONT_AND_BACK.

    An INVALID_ENUM error is generated by PolygonModeNV if <mode> is not one of
    POINT_NV, LINE_NV, or FILL_NV.

Issues

    1. How does PolygonModeNV interact with tessellation shaders?

    See Issue 29 of ARB_tessellation_shader.

Revision History

    Rev.    Date    Author     Changes
    ----  --------  ---------  -----------------------------------------
     1    09/10/14  jhelferty  Initial revision.
