Name OES_texture_half_float OES_texture_float Name Strings GL_OES_texture_half_float, GL_OES_texture_float Contact Benj Lipchak, Apple (lipchak 'at' apple.com) Notice Copyright (c) 2005-2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html IP Status Please refer to the ARB_texture_float extension. Status Ratified by the Khronos BOP, July 22, 2005. Version Last Modified Date: November 9, 2011 Number OpenGL ES Extension #36 Dependencies This extension is written against the OpenGL ES 2.0 Specification. OES_texture_3D affects the definition of this extension. Overview These extensions add texture formats with 16- (aka half float) and 32-bit floating-point components. The 32-bit floating-point components are in the standard IEEE float format. The 16-bit floating-point components have 1 sign bit, 5 exponent bits, and 10 mantissa bits. Floating-point components are clamped to the limits of the range representable by their format. The OES_texture_half_float extension string indicates that the implementation supports 16-bit floating pt texture formats. The OES_texture_float extension string indicates that the implementation supports 32-bit floating pt texture formats. Both these extensions only require NEAREST magnification filter and NEAREST, and NEAREST_MIPMAP_NEAREST minification filters to be supported. Issues 1. What should we do if magnification filter for a texture with half-float or float channels is set to LINEAR. RESOLUTION: The texture will be marked as incomplete. Only the NEAREST filter is supported. The cost of doing a LINEAR filter for these texture formats can be quite prohibitive. There was a discussion on having the shader generate code to do LINEAR filter by making individual texture calls with a NEAREST filter but again the computational and memory b/w costs decided against mandating this approach. The decision was that this extension would only enable NEAREST magnification filter. Support for LINEAR magnification filter would be done through a separate extension. 2. What should we do if minification filter is set to LINEAR or LINEAR_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR and LINEAR_MIPMAP_LINEAR. RESOLUTION: The texture will be marked as incomplete. Only the NEAREST and NEAREST_MIPMAP_NEAREST minification filters are supported. This was decided for the same reasons given in issue #1. The decision was that this extension would only enable NEAREST and NEAREST_MIPMAP_NEAREST minification filters, and the remaining OpenGL ES minification filters would be supported through a separate extension. 3. Should CopyTexImage2D, CopyTexSubImage{2D|3D} be supported for textures with half-float and float channels? RESOLUTION: No. New Procedures and Functions None New Tokens Accepted by the parameter of TexImage2D, TexSubImage2D, TexImage3D, and TexSubImage3D HALF_FLOAT_OES 0x8D61 FLOAT 0x1406 Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation) Add a new section called 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." Add to Table 2.2, p. 12: Minimum GL Type Bit Width Description ------- --------- ----------------------------------- half 16 Half-precision floating-point value encoded in an unsigned scalar Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) Add to Table 3.2, p. 62: type Parameter Corresponding Special Token Name GL Data Type Interpretation -------------- ------------- -------------- HALF_FLOAT_OES half No Modify first sentence of "Unpacking", p. 62: "Data are taken from client memory as a sequence of one of the GL data types listed in Table 3.2. These elements are..." Add to Table 3.4, p. 63: Format Type Bytes per Pixel --------- -------------- --------------- RGBA FLOAT 16 RGB FLOAT 12 LUMINANCE_ALPHA FLOAT 8 LUMINANCE FLOAT 4 ALPHA FLOAT 4 RGBA HALF_FLOAT_OES 8 RGB HALF_FLOAT_OES 6 LUMINANCE_ALPHA HALF_FLOAT_OES 4 LUMINANCE HALF_FLOAT_OES 2 ALPHA HALF_FLOAT_OES 2 Modify fifth paragraph of 3.7.1 Texture Image Specification, p. 67: "The selected groups are processed as described in section 3.6.2, stopping after final expansion to RGBA. If the internal format of the texture is fixed-point, components are clamped to [0,1]. Otherwise, values are not modified." Interactions with OES_texture_3D If OES_texture_3D is not supported, ignore references to TexImage3D and TexSubImage3D. Revision History 04/29/2005 0.1 Original draft. 06/29/2005 0.2 Added issues on why only NEAREST and NEAREST_MIPMAP_NEAREST filters are required. 04/21/2006 0.3 Added TexSubImage2D and TexSubImage3D as functions that take the new tokens. 06/14/2006 0.4 CopyTexImage2D, CopyTexSubImag{2D|3D} are not supported. 07/26/2011 0.5 Fix several omissions discovered while writing EXT_color_buffer_half_float. 11/09/2011 0.6 Fix missing FLOAT entries in Table 3.4, add interaction with OES_texture_3D.