| Name |
| |
| NV_packed_float |
| NV_packed_float_linear |
| |
| Name Strings |
| |
| GL_NV_packed_float |
| GL_NV_packed_float_linear |
| |
| Contributors |
| |
| Mark J. Kilgard, NVIDIA |
| Mathias Heyer, NVIDIA |
| Koji Ashida, NVIDIA |
| Greg Roth, NVIDIA |
| |
| Contact |
| |
| Mathias Heyer, NVIDIA (mheyer 'at' nvidia.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified: 2012/09/26 |
| NVIDIA Revision: 3 |
| |
| Number |
| |
| OpenGL ES Extension #127 |
| |
| |
| Dependencies |
| |
| Written against the OpenGL ES 2.0.25 (Nov. 2010) Specification. |
| |
| EXT_color_buffer_half_float affects the definition of this |
| specification. |
| |
| OES_texture_half_float affects the defintion of this specification. |
| |
| NV_framebuffer_multisample affects the defintion of this |
| specification. |
| |
| NV_texture_array affects the defintion of this specification. |
| |
| EXT_texture_storage affects the defintion of this specification. |
| |
| |
| Overview |
| |
| This extension adds a new 3-component floating-point texture format |
| that fits within a single 32-bit word. This format stores 5 bits |
| of biased exponent per component in the same manner as 16-bit |
| floating-point formats, but rather than 10 mantissa bits, the red, |
| green, and blue components have 6, 6, and 5 bits respectively. |
| Each mantissa is assumed to have an implied leading one except in the |
| denorm exponent case. There is no sign bit so only non-negative |
| values can be represented. Positive infinity, positive denorms, |
| and positive NaN values are representable. The value of the fourth |
| component returned by a texture fetch is always 1.0. |
| |
| This extension also provides support for rendering into an unsigned |
| floating-point rendering format with the assumption that the texture |
| format described above could also be advertised as an unsigned |
| floating-point format for rendering. |
| |
| The extension also provides a pixel external format for specifying |
| packed float values directly. |
| |
| |
| New Tokens |
| |
| Accepted by the <internalformat> parameter of RenderbufferStorage |
| and RenderBufferStorageMultisampleNV, TexStorage2DEXT and |
| TexStorage3DEXT: |
| |
| R11F_G11F_B10F_NV 0x8C3A |
| |
| Accepted by the <type> parameter of ReadPixels, TexImage2D, |
| TexSubImage2D, TexImage3DNV, TexSubImage3DNV: |
| |
| UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B |
| |
| |
| Changes to Chapter 2 of the OpenGL ES 2.0.25 Specification |
| (OpenGL Operation) |
| |
| Add two new sections after Section "Floating-Point Computation": |
| |
| "Unsigned 11-Bit Floating-Point Numbers" |
| |
| An unsigned 11-bit floating-point number has no sign bit, a 5-bit |
| exponent (E), and a 6-bit mantissa (M). The value of an unsigned |
| 11-bit floating-point number (represented as an 11-bit unsigned |
| integer N) is determined by the following: |
| |
| 0.0, if E == 0 and M == 0, |
| 2^-14 * (M / 64), if E == 0 and M != 0, |
| 2^(E-15) * (1 + M/64), if 0 < E < 31, |
| INF, if E == 31 and M == 0, or |
| NaN, if E == 31 and M != 0, |
| |
| where |
| |
| E = floor(N / 64), and |
| M = N mod 64. |
| |
| Implementations are also allowed to use any of the following |
| alternative encodings: |
| |
| 0.0, if E == 0 and M != 0 |
| 2^(E-15) * (1 + M/64) if E == 31 and M == 0 |
| 2^(E-15) * (1 + M/64) if E == 31 and M != 0 |
| |
| When a floating-point value is converted to an unsigned 11-bit |
| floating-point representation, finite values are rounded to the |
| closet representable finite value. While less accurate, |
| implementations are allowed to always round in the direction of |
| zero. This means negative values are converted to zero. |
| Likewise, finite positive values greater than 65024 (the maximum |
| finite representable unsigned 11-bit floating-point value) are |
| converted to 65024. Additionally: negative infinity is converted |
| to zero; positive infinity is converted to positive infinity; and |
| both positive and negative NaN are converted to positive NaN. |
| |
| Any representable unsigned 11-bit floating-point value is legal |
| as input to a GL command that accepts 11-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. |
| |
| "Unsigned 10-Bit Floating-Point Numbers" |
| |
| An unsigned 10-bit floating-point number has no sign bit, a 5-bit |
| exponent (E), and a 5-bit mantissa (M). The value of an unsigned |
| 10-bit floating-point number (represented as an 10-bit unsigned |
| integer N) is determined by the following: |
| |
| 0.0, if E == 0 and M == 0, |
| 2^-14 * (M / 32), if E == 0 and M != 0, |
| 2^(E-15) * (1 + M/32), if 0 < E < 31, |
| INF, if E == 31 and M == 0, or |
| NaN, if E == 31 and M != 0, |
| |
| where |
| |
| E = floor(N / 32), and |
| M = N mod 32. |
| |
| When a floating-point value is converted to an unsigned 10-bit |
| floating-point representation, finite values are rounded to the |
| closet representable finite value. While less accurate, |
| implementations are allowed to always round in the direction of |
| zero. This means negative values are converted to zero. |
| Likewise, finite positive values greater than 64512 (the maximum |
| finite representable unsigned 10-bit floating-point value) are |
| converted to 64512. Additionally: negative infinity is converted |
| to zero; positive infinity is converted to positive infinity; and |
| both positive and negative NaN are converted to positive NaN. |
| |
| Any representable unsigned 10-bit floating-point value is legal |
| as input to a GL command that accepts 10-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. |
| |
| |
| Changes to Chapter 3 of the OpenGL ES 2.0.25 Specification (Rasterization) |
| |
| Add to Table 3.2, p. 62: |
| |
| type Parameter Corresponding Special |
| Token Name GL Data Type Interpretation |
| ------------------------------- ------------- -------------- |
| UNSIGNED_INT_10F_11F_11F_REV_NV uint Yes |
| |
| Add to Table 3.4, p. 63: |
| |
| Format Type Bytes per Pixel |
| --------- ------------------------------- --------------- |
| RGB UNSIGNED_INT_10F_11F_11F_REV_NV 4 |
| |
| Add to Table 3.5, p. 64: |
| |
| type Parameter GL Data Number of Matching |
| Token Name Type Components Pixel Formats |
| ------------------------------- ------- ---------- -------------- |
| UNSIGNED_INT_10F_11F_11F_REV_NV uint 3 RGB |
| |
| |
| Add the following to section 3.6.2 Transfor of Pixel Rectangles, |
| subsection Unpacking |
| |
| |
| UNSIGNED_INT_10F_11F_11F_REV_NV: |
| |
| 31 30 ... 23 22 21 20 ... 12 11 10 9 ... 1 0 |
| +---------------+---------------+---------------+ |
| | 3rd | 2nd | 1st | |
| +---------------+---------------+---------------+ |
| |
| |
| Changes to Chapter 4 of the OpenGL ES 2.0.25 Specification |
| (Per-Fragment Operations and the Framebuffer) |
| |
| Add the following to the end of Section 4.3, subsection |
| "Final Color Conversion" |
| |
| If an implementation allows calling ReadPixels with a <type> of |
| UNSIGNED_INT_10F_11F_11F_REV_NV and format of RGB, the conversion |
| is done as follows: The returned data are packed into a series of |
| GL uint values. The red, green, and blue components are converted |
| to unsigned 11-bit floating-point, unsigned 11-bit floating-point, |
| and unsigned 10-bit floating point as described in section |
| 2.1.A and 2.1.B. The resulting red 11 bits, green 11 bits, and blue |
| 10 bits are then packed as the 1st, 2nd, and 3rd components of the |
| UNSIGNED_INT_10F_11F_11F_REV_NV format as shown in Section 3.6. |
| |
| |
| Add to Table 4.4, p. 106: |
| |
| type Parameter Component |
| Token Name GL Data Type Conversion Formula |
| -------------- ------------- ------------------ |
| UNSIGNED_INT_10F_11F_11F_REV_NV uint c = f |
| |
| (modify "Final Conversion", p. 106): |
| If type is not FLOAT, HALF_FLOAT_OES or UNSIGNED_INT_10F_11F_11F_REV_NV, |
| each component is first clamped to [0,1]. Then the appropriate conversion... |
| |
| Add to Table 4.5, p. 117: |
| |
| Sized Renderable R G B A D S |
| Internal Format Type bits bits bits bits bits bits |
| --------------- ---------------- ---- ---- ---- ---- ---- ---- |
| R11F_G11F_B10F_NV color-renderable f11 f11 f10 |
| |
| |
| Errors |
| |
| Relaxation of INVALID_ENUM errors |
| --------------------------------- |
| |
| RenderbufferStorage and RenderBufferStorageMultisampleNV accept |
| the new R11F_G11F_B10F_EXT token for <internalformat>. |
| |
| ReadPixels, TexImage2D, TexSubImage2D, TexImage3DNV and |
| TexSubImage3DNV accept the new UNSIGNED_INT_10F_11F_11F_REV_EXT |
| token for <type>. |
| |
| |
| New errors |
| ---------- |
| |
| INVALID_OPERATION is generated by ReadPixels, TexImage2D, |
| TexSubImage2D, TexImage3DNV and TexSubImage3DNV if <type> is |
| UNSIGNED_INT_10F_11F_11F_REV_EXT and <format> is not RGB. |
| |
| |
| Dependencies on OES_texture_half_float |
| |
| If OES_texture_half_float is not supported, 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." |
| |
| 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..." |
| |
| Additionally, ignore all references to RGBA16F_EXT, RGB16F_EXT, |
| RG16F_EXT, R16F_EXT, HALF_FLOAT_OES and half. |
| |
| Dependencies on EXT_color_buffer_half_float |
| |
| If EXT_color_buffer_half_float is not supported, do not consider |
| R11F_G11F_B10F_NV color-renderable. Remove all changes and additions |
| to Chapter 4 of the OpenGL ES 2.0 Specification. |
| |
| Dependencies on NV_packed_float_linear |
| |
| If NV_packed_float_linear is not supported, using LINEAR |
| magnification filter and LINEAR, NEAREST_MIPMAP_LINEAR, |
| LINEAR_MIPMAP_NEAREST and LINEAR_MIPMAP_NEAREST minification |
| filters will cause packed float textures to be considered |
| incomplete. |
| |
| Dependencies on NV_framebuffer_multisample |
| |
| If NV_framebuffer_multisample is missing, remove all refernences to |
| RenderBufferStorageMultisampleNV. |
| |
| Dependencies on NV_texture_array |
| |
| If NV_texture_array is not supported, remove all references to |
| TexImage3DNV and TexSubImage3DNV. |
| |
| Dependencies on EXT_texture_storage |
| |
| If EXT_texture_storage is not supported, remove all references to |
| TexStorage2DEXT and TexStorage3DEXT. |
| |
| Issues |
| |
| 1) Are the new formats allowed in window surface and pbuffer managed |
| by EGL? |
| |
| No. Let's focus on framebuffer objects. |
| |
| See EXT_packed_float for other relevant issues. |
| |
| Revision History |
| |
| #3 - 05.11.2012 (Mathias Heyer) |
| - Remove FRAMEBUFFER_ATTACHMENT_RGBA_SIGNED_COMPONENTS_NV, as its |
| neither in desktop GL nor ES3 |
| |
| #2 - 26.09.2012 (Mathias Heyer) |
| - Make FRAMEBUFFER_ATTACHMENT_RGBA_SIGNED_COMPONENTS_NV a property of |
| framebuffer attachments, adjust the table entries for ES2.0 |
| - add interactions with various other ES2.0 extensions |
| |
| #1 - 03.10.2008 |
| |
| First draft written based on EXT_packed_float. |