Name

    ARB_half_float_vertex

Name Strings

    GL_ARB_half_float_vertex

Contact

    Daniel Koch, TransGaming, Inc (daniel 'at' transgaming.com)

Notice

    Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Approved by the ARB on July 11, 2008

Version

    Last Modified Date:   August 7, 2008
    Version               5

Number

    ARB Extension #48

Dependencies

    This extension is written against the OpenGL 2.1 Specification

    Based on the NV_half_float and OES_vertex_half_float extensions.

Overview

    This extension extends the usage of the half-precision (16-bit) floating-
    point quantities introduced in ARB_half_float_pixel for usage in specifying
    vertex array data.

    This extension allows applications to use half-precision floating point data
    when specifying vertices.  This can allow applications to reduce their
    memory footprint, as well as the memory bandwidth required for vertex data.

    This extension extends the existing vertex array commands to accept the new
    data type.


Issues

    1. How is this extension different from NV_half_float or
       ARB_half_float_pixel?

    This extension adds the commands for specifying half-precision
    vertex data that were initially introduced in the NV_half_float
    extension but were specifically excluded from the
    ARB_half_float_pixel extension. The functionality added in this
    extension is a proper subset of the vertex functionality defined in
    the NV_half_float extension.

    2. Should we provide immediate-mode entry points for half-precision
    vertex data?

    No. We expect the immediate-mode API to be deprecated in the near
    future and thus do not wish to encumber implementors with adding a
    significant number of additional entry points that would have
    limited usefulness. Additionaly, the half-precision floating point
    vertex data is only interesting when it is specified in array format
    (i.e., for saving storage space). If an application is using
    immediate mode APIs to load the vertex data, it does not seem overly
    onerous to require them to convert to one of the more standard data
    types.

    3. What is the half-precision floating point format?

    This is the same 16-bit floating point format that is defined in
    Section 2.1.2 of the ARB_texture_float and ARB_half_float_pixel
    extensions.

    4. How does this extension differ from OES_vertex_half_float?

    It is intended to have the same functionality, however there are a
    few minor changes spec-wise:

     a) this extension defines the additional GLX protocol, as was done
        in the NV_half_float extension.
     b) this extension uses the value of the HALF_FLOAT_ARB (0x140B)
        token that is already defined in the desktop version of the
        ARB_half_float_pixel extension (which is the same as the value
        of the HALF_FLOAT_NV token from the NV_half_float extension).
        The OES_vertex_half_float and OES_texture_half_float extensions
        use the HALF_FLOAT_OES (0x8D61) token.

    The logical progression is to define this as an ARB extension which
    is intended to supersede both the OES extension and the
    functionality from NV_half_float.

    5. Why don't the new tokens and entry points in this extension have
       "ARB" suffixes like other ARB extensions?

    RESOLVED: Unlike a normal ARB extension, this is a strict subset of
    functionality already approved in OpenGL 3.0. This extension exists
    only to support that functionality on older hardware that cannot
    implement a full OpenGL 3.0 driver. Since there are no possible
    behavior changes between the ARB extension and core features, source
    code compatibility is improved by not using suffixes on the
    extension.

New Procedures and Functions

    None

New Tokens

    Accepted by the <type> argument of VertexPointer, NormalPointer,
    ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer,
    and VertexAttribPointer:

    HALF_FLOAT                                       0x140B

Additions to Chapter 2 of the OpenGL 2.1 Specification (OpenGL Operation)

    Modify Section 2.8, Vertex Arrays, p. 23

    (Modify 1st paragraph on p. 24) ... For <type>, the values BYTE, SHORT,
    INT, FLOAT, HALF_FLOAT, and DOUBLE indicate types byte, short, int,
    float, half, and double, respectively. ...

    (Modify Table 2.4, p. 25)

        Command                   Sizes      Types
        ------------------        -------    ---------------------------------
        VertexPointer             2,3,4      short, int, float, half, double
        NormalPointer             3          byte, short, int, float, half,
                                             double
        ColorPointer              3,4        byte, ubyte, short, ushort, int,
                                             uint, float, half, double
        SecondaryColorPointer     3          byte, ubyte, short, ushort, int,
                                             uint, float, half, double
        IndexPointer              1          ubyte, short, int, float, double
        FogCoordPointer           1          float, half, double
        TexCoordPointer           1,2,3,4    short, int, float, half, double
        EdgeFlagPointer           1          boolean
        VertexAttribPointer       1          byte, ubyte, short, ushort, int,
                                             uint, float, half, double

        Table 2.4: Vertex array sizes (values per vertex) and data types.

    Modify Section 2.13, Colors and Coloring, p.44

    (Modify Table 2.6, p. 59)  Add new row to the table:

         GL Type    Conversion
         -------    ----------
         half          c


Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization)

    None.


Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment
Operations and the Framebuffer)

    None.


Additions to Chapter 5 of the OpenGL 2.1 Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 2.1 Specification (State and
State Requests)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol (Modification to the GLX 1.3 Protocol Encoding Specification)

    Add to Section 1.4 (p.2), Common Types

        FLOAT16     A 16-bit floating-point value in the format specified
                    in the ARB_half_float_pixel extension specification.

    Modify Section 2.3.4, GL Rendering Commands That May Be Large (p. 127)

     (Modify the ARRAY_INFO portion of the DrawArrays encoding (p.129) to
      reflect the new data type supported by vertex arrays.)

         ARRAY_INFO

            4       enum                    data type
                    0x1400   i=1            BYTE
                    0x1401   i=1            UNSIGNED_BYTE
                    0x1402   i=2            SHORT
                    ...
                    0x140B   i=2            HALF_FLOAT
            4       INT32                   j
            4       ENUM                    array type
                ...

Errors

    None

New State

    None

New Implementation Dependent State

    None

Revision History

    Rev.    Date    Author    Changes
    ----  -------- ---------  --------------------------------------------
      1   1/22/08  dgkoch     Initial version based on the NV_half_float
                              and ARB_half_float_pixel specification. Updated
                              to reference OpenGL 2.1 spec.
      2   1/22/08  dgkoch     Made some grammatical clarifications.
      3   2/01/08  dgkoch     Clarify dependencies and interactions with other
                              extensions.
      4   2/25/08  dgkoch     Add issue #4.
      5   8/07/08  jleech     Remove _ARB suffix.

