| Name |
| |
| ARB_half_float_pixel |
| |
| Name Strings |
| |
| GL_ARB_half_float_pixel |
| |
| Contributors |
| |
| Pat Brown |
| Jon Leech |
| Rob Mace |
| Brian Paul |
| |
| Contact |
| |
| Dale Kirkland, NVIDIA (dkirkland 'at' nvidia.com) |
| |
| Notice |
| |
| Copyright (c) 2004-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 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 |
| |
| Status |
| |
| Complete. Approved by the ARB on October 22, 2004. |
| |
| Version |
| |
| Last Modified Date: October 1, 2004 |
| Version: 6 |
| |
| Number |
| |
| ARB Extension #40 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 2.0 Specification |
| but will work with the OpenGL 1.5 Specification. |
| |
| Based on the NV_half_float extension. |
| |
| This extension interacts with ARB_color_buffer_float. |
| |
| Overview |
| |
| This extension introduces a new data type for half-precision (16-bit) |
| floating-point quantities. The floating-point format is very similar |
| to the IEEE single-precision floating-point standard, except that it |
| has only 5 exponent bits and 10 mantissa bits. Half-precision floats |
| are smaller than full precision floats and provide a larger dynamic |
| range than similarly sized normalized scalar data types. |
| |
| This extension allows applications to use half-precision floating- |
| point data when specifying pixel data. It extends the existing image |
| specification commands to accept the new data type. |
| |
| Floating-point data is clamped to [0, 1] at various places in the |
| GL unless clamping is disabled with the ARB_color_buffer_float |
| extension. |
| |
| IP Status |
| |
| SGI owns US Patent #6,650,327, issued November 18, 2003. SGI |
| believes this patent contains necessary IP for graphics systems |
| implementing floating point (FP) rasterization and FP framebuffer |
| capabilities. |
| |
| SGI will not grant the ARB royalty-free use of this IP for use in |
| OpenGL, but will discuss licensing on RAND terms, on an individual |
| basis with companies wishing to use this IP in the context of |
| conformant OpenGL implementations. SGI does not plan to make any |
| special exemption for open source implementations. |
| |
| Contact Doug Crisman at SGI Legal for the complete IP disclosure. |
| |
| Issues |
| |
| 1. How is this extension different from the NV_half_float extension? |
| |
| This extension does not add new commands for specifying half- |
| precision vertex data, and all imaging functions have been listed |
| for supporting the "half" type. |
| |
| 2. What should the new data type be called? "half"? "hfloat"? |
| |
| RESOLVED: half . This convention builds on the convention of |
| using the type "double" to describe double-precision floating- |
| point numbers. Here, "half" will refer to half-precision |
| floating-point numbers. |
| |
| Even though the 16-bit float data type is a first-class data type, |
| it is still more problematic than the other types in the sense |
| that no native programming languages support the data type. |
| "hfloat/hf" would have reflected a second-class status better |
| than "half/h". |
| |
| Both names are not without conflicting precedents. The name "half" |
| is used to connote 16-bit scalar values on some 32-bit CPU |
| architectures (e.g., PowerPC). The name "hfloat" has been used to |
| describe 128-bit floating-point data on VAX systems. |
| |
| 3. Should half-precision data be accepted by commands in the imaging |
| subset that accept pixel data? |
| |
| RESOLVED: Yes, all functions in the core OpenGL and the imaging |
| subset that accept pixel data accept half-precision data. |
| |
| 4. Should the special representations NaN, INF, and denormal be |
| supported? |
| |
| RESOLVED: Implementation dependent. The spec reflects that Nan |
| and INF produce unspecified results. Denormalized numbers can |
| be treated as a value of 0. |
| |
| |
| New Tokens |
| |
| Accepted by the <type> parameter of DrawPixels, ReadPixels, |
| TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, |
| TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, |
| ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, |
| SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, |
| and GetColorTable: |
| |
| HALF_FLOAT_ARB 0x140B |
| |
| Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) |
| |
| Add a new Section 2.1.2, (p. 6): |
| |
| 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. |
| |
| (modify Table 2.2, p. 9) -- add new row |
| |
| Minimum |
| GL Type Bit Width Description |
| ------- --------- ----------------------------------- |
| half 16 half-precision floating-point value |
| encoded in an unsigned scalar |
| |
| Modify Section 2.14, (Colors and Coloring), p. 59 |
| |
| (modify Table 2.9, p. 59) Add new row to the table: |
| |
| GL Type Conversion |
| ------- ---------- |
| half c |
| |
| |
| Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) |
| |
| Modify Section 3.6.4, Rasterization of Pixel Rectangles (p. 126) |
| |
| (modify Table 3.5, p. 128 -- add new row) |
| |
| type Parameter Corresponding Special |
| Token Name GL Data Type Interpretation |
| -------------- ------------- -------------- |
| HALF_FLOAT_ARB half No |
| |
| (modify Unpacking, p. 129) Data are taken from host memory as a |
| sequence of signed or unsigned bytes (GL data types byte and ubyte), |
| signed or unsigned integers (GL data types int and uint), or |
| floating-point values (GL data types half and float). |
| |
| Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment |
| Operations and the Framebuffer) |
| |
| Modify Section 4.3.2, Reading Pixels (p. 219) |
| |
| (modify Final Conversion, p. 222) For an index, if the type is not |
| FLOAT or HALF_FLOAT_ARB, final conversion consists of masking the |
| index with the value given in Table 4.6; if the type is FLOAT or |
| HALF_FLOAT_ARB, then the integer index is converted to a GL float |
| or half data value. |
| |
| (modify Table 4.7, p. 224 -- add new row) |
| |
| type Parameter GL Data Type Component Conversion Formula |
| -------------- ------------ ---------------------------- |
| HALF_FLOAT_ARB half c = f |
| |
| Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the OpenGL 2.0 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) |
| |
| Modify Appendix A, Pixel Data (p. 148) |
| |
| (Modify Table A.1, p. 149 -- add new row for HALF_FLOAT_ARB data) |
| |
| type Encoding Protocol Type nbytes |
| ------------- -------- ------------- ------ |
| HALF_FLOAT_ARB 0x140B CARD16 2 |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| None |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- --------- -------------------------------------------- |
| 1 12/15/03 Kirkland Initial version based on the NV_half_float |
| specification. |
| |
| 2 2/26/04 Kirkland Changed NVIDIA_xxx to NV_xxx. |
| Changed the issue resolution for INF and NaN. |
| |
| 3 3/11/04 Kirkland Updated language for float16 number handling. |
| Added bit encodings for half values. |
| Added issue dealing with name "half". |
| |
| 4 7/23/04 Kirkland Added alternative encodings options for |
| float16 format. |
| |
| 5 9/17/04 Kirkland Updated to reference OpenGL 2.0 spec. |
| |
| 6 10/1/04 Kirkland Updated IP section. |