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 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 value in Table 2.4. For 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 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.