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