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 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 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.