OES_vertex_half_float

Name

OES_vertex_half_float

Name Strings

GL_OES_vertex_half_float

Contact

Aaftab Munshi (amunshi@ati.com)

Notice

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

Specification Update Policy

Khronos-approved extension specifications are updated in response to
issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
extensions which have been promoted to a core Specification, fixes will
first appear in the latest version of that core Specification, and will
eventually be backported to the extension document. This policy is
described in more detail at
    https://www.khronos.org/registry/OpenGL/docs/update_policy.php

IP Status

None.

Status

Ratified by the Khronos BOP, July 22, 2005.

Version

April 22, 2007 (version #3)

Number

OpenGL ES Extension #38

Dependencies

This extension is written against the OpenGL 2.0 specification

Overview

This extension adds a 16-bit floating pt data type (aka half float) 
to vertex data specified using vertex arrays.  The 16-bit floating-point
components have 1 sign bit, 5 exponent bits, and 10 mantissa bits.

The half float data type can be very useful in specifying vertex attribute 
data such as color, normals, texture coordinates etc.  By using half floats 
instead of floats, we reduce the memory requirements by half.  Not only does 
the memory footprint reduce by half, but the memory bandwidth required for
vertex transformations also reduces by the same amount approximately.
Another advantage of using half floats over short/byte data types is that we 
do not needto scale the data.  For example, using SHORT for texture coordinates 
implies that we need to scale the input texture coordinates in the shader or 
set an appropriate scale matrix as the texture matrix for fixed function pipeline.
Doing these additional scaling operations impacts vertex transformation
performance.

Issues

1.  Should there be a half-float version of VertexAttrib{1234}[v] functions

RESOLUTION: No.  

There is no reason to support this, as these functions are not
performance or memory footprint critical.  It is much more important that the
vertex data specified using vertex arrays be able to support half float data
format.

New Procedures and Functions

None

New Tokens

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

    HALF_FLOAT_OES      0x8D61

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

Add a new section 2.1.2.  This new section is copied from the 
ARB_texture_float extension.

2.1.2  16-Bit Floating-Point Numbers

A 16-bit floating-point number has a 1-bit sign (S), a 5-bit
exponent (E), and a 10-bit mantissa (M).  The value of a 16-bit
floating-point number is determined by the following:

    (-1)^S * 0.0,                        if E == 0 and M == 0,
    (-1)^S * 2^-14 * (M / 2^10),         if E == 0 and M != 0,
    (-1)^S * 2^(E-15) * (1 + M/2^10),    if 0 < E < 31,
    (-1)^S * INF,                        if E == 31 and M == 0, or
    NaN,                                 if E == 31 and M != 0,

where

    S = floor((N mod 65536) / 32768),
    E = floor((N mod 32768) / 1024), and
    M = N mod 1024.

Implementations are also allowed to use any of the following
alternative encodings:

    (-1)^S * 0.0,                        if E == 0 and M != 0,
    (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M == 0, or
    (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M != 0,

Any representable 16-bit floating-point value is legal as input
to a GL command that accepts 16-bit floating-point data.  The
result of providing a value that is not a floating-point number
(such as infinity or NaN) to such a command is unspecified, but
must not lead to GL interruption or termination.  Providing a
denormalized number or negative zero to GL must yield predictable
results.

Modifications to section 2.8 (Vertex Arrays)

Add HALF_FLOAT_OES as a valid <type> value in Table 2.4.
    
For <type> the values BYTE, SHORT, INT, FLOAT, and DOUBLE indicate
types byte, short, int, float, and double, respectively; and the values
UNSIGNED_BYTE, UNSIGNED_SHORT, and UNSIGNED_INT indicate types ubyte,
ushort, and uint, respectively.  A <type> value of HALF_FLOAT_OES represents
a 16-bit floating point number with 1 sign bits, 5 exponent bits,
and 10 mantissa bits.

Errors

None

New State

None

Revision History

June 15, 2005    Aaftab Munshi    First draft of extension.
June 22, 2005    Aaftab Munshi    Renamed HALF_FLOAT token to HALF_FLOAT_OES
#3, 2007/04/22   Jon Leech        Add version date and extension number.