| Name |
| |
| APPLE_color_buffer_packed_float |
| |
| Name Strings |
| |
| GL_APPLE_color_buffer_packed_float |
| |
| Contributors |
| |
| Alexander Rogoyski, Apple Inc |
| Serge Metral, Apple Inc |
| |
| Contact |
| |
| Alexander Rogoyski, Apple Inc (rogoyski 'at' apple.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified Date: February 13, 2014 |
| Version: 1.0 |
| |
| Number |
| |
| OpenGL ES Extension #194 |
| |
| Dependencies |
| |
| Requires EXT_color_buffer_half_float |
| |
| Requires OpenGL ES 3.0 or APPLE_texture_packed_float |
| |
| Written against the OpenGL ES 2.0.25 (Nov. 2010) Specification. |
| |
| OpenGL ES 2.0 interacts with this extension. |
| |
| OpenGL ES 3.0 interacts with this extension. |
| |
| Overview |
| |
| This extension allows two packed floating point formats |
| R11F_G11F_B10F and as RGB9_E5 defined in APPLE_texture_packed_float or |
| OpenGL ES 3.0 or to be rendered to via framebuffer objects. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| None |
| |
| Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment |
| Operations and the Framebuffer) |
| |
| Modify Section 4.3.1 (Reading Pixels), p. 104 |
| |
| (modify first paragraph, p 104) ...Only two combinations of format and type |
| are accepted. The first varies depending on the format of the currently |
| bound rendering surface. For normalized fixed-point rendering surfaces, |
| the combination format RGBA and type UNSIGNED_BYTE is accepted. For |
| R11F_G11F_B10F surfaces, the combination RGB and |
| UNSIGNED_INT_10F_11F_11F_REV_APPLE is accepted. For RGB9_E5 surfaces, the |
| combination RGB and GL_UNSIGNED_INT_5_9_9_9_REV_APPLE is accepted. For |
| floating-point rendering surfaces, the combination format RGBA and type |
| FLOAT is accepted. The second is an implementation-chosen format... |
| |
| (modify "Conversion of RGBA Values", p. 106) The R, G, B, and A values |
| form a group of elements. For a fixed-point color buffer, each element is |
| converted to floating-point according to section 2.1.2. For a floating- |
| point color buffer, the elements are unmodified. |
| |
| Add to Table 4.4, p. 106: |
| |
| type Parameter Component |
| Token Name GL Data Type Conversion Formula |
| ---------------------------------- ------------- ------------------ |
| UNSIGNED_INT_10F_11F_11F_REV_APPLE uint see below |
| UNSIGNED_INT_5_9_9_9_REV uint see below |
| |
| |
| (modify "Final Conversion", p. 106) If type is not FLOAT, HALF_FLOAT_OES, |
| UNSIGNED_INT_10F_11F_11F_REV_APPLE or UNSIGNED_INT_5_9_9_9_REV |
| each component is first clamped to [0,1]. Then the appropriate conversion |
| formula from table 4.4 is applied to the component. |
| |
| "Encoding of Special Internal Formats" |
| |
| If <type> is UNSIGNED_INT_10F_11F_11F_REV_APPLE, the red, green, |
| and blue bits are converted to unsigned 11-bit, unsigned 11-bit, |
| and unsigned 10-bit floating-point values as described in |
| "Unsigned 11-BitFloating-Point Numbers" and "Unsigned 10-Bit |
| Floating-Point Numbers" |
| |
| If <type> is UNSIGNED_INT_5_9_9_9_REV_APPLE, the red, green, and |
| blue bits are converted to a shared exponent format according to |
| the following procedure: Components red, green, and blue are |
| first clamped (in the process, mapping NaN to zero) as follows: |
| |
| red_c = max(0, min(sharedexp_max, red)) |
| green_c = max(0, min(sharedexp_max, green)) |
| blue_c = max(0, min(sharedexp_max, blue)) |
| |
| where: |
| |
| sharedexp_max = (2^N - 1) / 2^N * 2^(E_max - B) |
| |
| N is the number of mantissa bits per component (9), B is the |
| exponent bias (15), and E_max is the maximum allowed biased exponent |
| value (31). The largest clamped component, max_c, is determined: |
| |
| max_c = max(red_c, green_c, blue_c) |
| |
| A preliminary shared exponent exp_p is computed: |
| |
| exp_p = max(-B - 1, floor(log2(max_c))) + 1 + B |
| |
| A refined shared exponent exp_s is computed: |
| |
| max_s = floor(max_c / 2^(exp_p - B - N) + 0.5) |
| |
| / exp_p, 0 <= max_s < 2^N |
| exp_s = |
| \ exp_p+1, max_s = 2^N |
| |
| Finally, three integer values in the range 0 to 2^N - 1 are computed: |
| |
| red_s = floor(red_c / 2^(exp_s - B - N) + 0.5) |
| green_s = floor(green_c / 2^(exp_s - B - N) + 0.5) |
| blue_s = floor(blue_c / 2^(exp_s - B - N) + 0.5) |
| |
| The resulting red_s, green_s, blue_s, and exp_s are stored in the red, |
| green, blue, and shared bits respectively. |
| |
| Add to Table 4.5, p. 117: |
| |
| Sized Renderable R G B A D S Shared |
| Internal Format Type bits bits bits bits bits bits bits |
| -------------------- ---------------- ---- ---- ---- ---- ---- ---- ------ |
| R11F_G11F_B10F_APPLE color-renderable f11 f11 f10 |
| RGB9_E5_APPLE color-renderable 9 9 9 5 |
| |
| (modify table description) Table 4.5: Renderbuffer image formats, showing |
| their renderable type (color-, depth-, or stencil-renderable) and the number |
| of bits each format contains for color (R, G, B, A), depth (D), and stencil |
| (S) components. The component resolution prefix indicates the internal data |
| type: f is floating-point, no prefix is unsigned normalized fixed-point. |
| |
| Errors |
| |
| Relaxation of INVALID_ENUM errors |
| --------------------------------- |
| |
| RenderbufferStorage accepts the new R11F_G11F_B10F_APPLE and |
| RGB9_E5_APPLE token for <internalformat>. |
| |
| Dependencies on OpenGL ES 3.0 |
| |
| Replace all references to UNSIGNED_INT_10F_11F_11F_REV_APPLE and |
| UNSIGNED_INT_5_9_9_9_REV_APPLE with non _APPLE versions respectively. |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Revision History |
| |
| 1.0 2014/02/1 rogoyski Initial version |
| |
| |