blob: 2413b5d69e4318514a7482244af18176638d8534 [file] [log] [blame]
Name
EXT_packed_float
Name Strings
GL_EXT_packed_float
WGL_EXT_pixel_format_packed_float
GLX_EXT_fbconfig_packed_float
Contact
Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
Status
Preliminary
Version
Date: February 15, 2006
Revision: 0.3
Number
328
Dependencies
OpenGL 1.1 required
ARB_color_buffer_float affects this extension.
EXT_texture_shared_exponent trivially affects this extension.
EXT_framebuffer_object affects this extension.
WGL_ARB_pixel_format is required for use with WGL.
WGL_ARB_pbuffer affects WGL pbuffer support for this extension.
GLX 1.3 is required for use with GLX.
This extension is written against the OpenGL 2.0 (September 7,
2004) 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 Procedures and Functions
None
New Tokens
Accepted by the <internalformat> parameter of TexImage1D,
TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and
RenderbufferStorageEXT:
R11F_G11F_B10F_EXT 0x8C3A
Accepted by the <type> parameter of DrawPixels, ReadPixels,
TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D,
TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax,
ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D,
GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter,
ColorTable, ColorSubTable, and GetColorTable:
UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B
Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and
GetDoublev:
RGBA_SIGNED_COMPONENTS_EXT 0x8C3C
Accepted as a value in the <piAttribIList> and <pfAttribFList>
parameter arrays of wglChoosePixelFormatARB, and returned in the
<piValues> parameter array of wglGetPixelFormatAttribivARB, and the
<pfValues> parameter array of wglGetPixelFormatAttribfvARB:
WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
Accepted as values of the <render_type> arguments in the
glXCreateNewContext and glXCreateContext functions
GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1
Returned by glXGetFBConfigAttrib (when <attribute> is set to
GLX_RENDER_TYPE) and accepted by the <attrib_list> parameter of
glXChooseFBConfig (following the GLX_RENDER_TYPE token):
GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008
Additions to Chapter 2 of the 2.0 Specification (OpenGL Operation)
-- Add two new sections after Section 2.1.2, (page 6):
2.1.A 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.
2.1.B 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.
Additions to Chapter 3 of the 2.0 Specification (Rasterization)
-- Section 3.6.4, Rasterization of Pixel Rectangles
Add a new row to Table 3.5 (page 128):
type Parameter Corresponding Special
Token Name GL Data Type Interpretation
-------------------------------- ------------- --------------
UNSIGNED_INT_10F_11F_11F_REV_EXT uint yes
Add a new row to table 3.8: Packed pixel formats (page 132):
type Parameter GL Data Number of Matching
Token Name Type Components Pixel Formats
-------------------------------- ------- ---------- -------------
UNSIGNED_INT_10F_11F_11F_REV_EXT uint 3 RGB
Add a new entry to table 3.11: UNSIGNED_INT formats (page 134):
UNSIGNED_INT_10F_11F_11F_REV_EXT:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+----------------------------+--------------------------------+---------------------------------+
| 3rd | 2nd | 1st |
+----------------------------+--------------------------------+---------------------------------+
Add to the end of the 2nd paragraph starting "Pixels are draw using":
"If type is UNSIGNED_INT_10F_11F_11F_REV_EXT and format is not RGB
then the error INVALID_ENUM occurs."
Add UNSIGNED_INT_10F_11F_11F_REV_EXT to the list of packed formats
in the 10th paragraph after the "Packing" subsection (page 130).
Add before the 3rd paragraph (page 135, starting "Calling DrawPixels
with a type of BITMAP...") from the end of the "Packing" subsection:
"Calling DrawPixels with a type of UNSIGNED_INT_10F_11F_11F_REV_EXT
and format of RGB is a special case in which the data are a series
of GL uint values. Each uint value specifies 3 packed components
as shown in table 3.11. The 1st, 2nd, and 3rd components are
called f_red (11 bits), f_green (11 bits), and f_blue (10 bits)
respectively.
f_red and f_green are treated as unsigned 11-bit floating-point values
and converted to floating-point red and green components respectively
as described in section 2.1.A. f_blue is treated as an unsigned
10-bit floating-point value and converted to a floating-point blue
component as described in section 2.1.B."
-- Section 3.8.1, Texture Image Specification:
"Alternatively if the internalformat is R11F_G11F_B10F_EXT, 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 sections 2.1.A and 2.1.B. These encoded values can be later
decoded back to floating-point values due to texture image sampling
or querying."
Add a new row to Table 3.16 (page 154).
Sized Base R G B A L I D
Internal Format Internal Format bits bits bits bits bits bits bits
--------------------- --------------- ---- ---- ---- ---- ---- ---- ----
R11F_G11F_B10F_EXT RGB 11 11 10
Additions to Chapter 4 of the 2.0 Specification (Per-Fragment Operations
and the Frame Buffer)
-- Modify Chapter 4 Introduction, (page 198)
Modify first sentence of third paragraph (page 198):
"Color buffers consist of either signed or unsigned integer color
indices, R, G, B and optionally A signed or unsigned integer values,
or R, G, B, and optionally A signed or unsigned floating-point
values."
-- Section 4.3.2, Reading Pixels
Add a row to table 4.7 (page 224);
Component
type Parameter GL Data Type Conversion Formula
-------------------------------- ------------ ------------------
UNSIGNED_INT_10F_11F_11F_REV_EXT uint special
Replace second paragraph of "Final Conversion" (page 222) to read:
For an RGBA color, if <type> is not one of FLOAT,
UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT,
or if the CLAMP_READ_COLOR_ARB is TRUE, or CLAMP_READ_COLOR_ARB
is FIXED_ONLY_ARB and the selected color (or texture) buffer is
a fixed-point buffer, each component is first clamped to [0,1].
Then the appropriate conversion formula from table 4.7 is applied
the component."
Add a paragraph after the second paragraph of "Final Conversion"
(page 222):
"In the special case when calling ReadPixels with a type of
UNSIGNED_INT_10F_11F_11F_REV_EXT 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_EXT format as shown in table 3.11."
Additions to Chapter 5 of the 2.0 Specification (Special Functions)
None
Additions to Chapter 6 of the 2.0 Specification (State and State Requests)
None
Additions to the OpenGL Shading Language specification
None
Additions to Chapter 3 of the GLX 1.3 Specification (Functions and
Errors)
Replace Section 3.3.3 (p.12) Paragraph 4 to:
The attribute GLX_RENDER_TYPE has as its value a mask indicating
what type of GLXContext a drawable created with the corresponding
GLXFBConfig can be bound to. The following bit settings are supported:
GLX_RGBA_BIT, GLX_RGBA_FLOAT_BIT, GLX_RGBA_UNSIGNED_FLOAT_BIT,
GLX_COLOR_INDEX_BIT. If combinations of bits are set in the mask
then drawables created with the GLXFBConfig can be bound to those
corresponding types of rendering contexts.
Add to Section 3.3.3 (p.15) after first paragraph:
Note that unsigned floating point rendering is only supported
for GLXPbuffer drawables. The GLX_DRAWABLE_TYPE attribute of
the GLXFBConfig must have the GLX_PBUFFER_BIT bit set and the
GLX_RENDER_TYPE attribute must have the GLX_RGBA_UNSIGNED_FLOAT_BIT
set. Unsigned floating point rendering assumes the framebuffer
format has no sign bits so all component values are non-negative.
In contrast, conventional floating point rendering assumes signed
components.
Modify Section 3.3.7 (p.25 Rendering Contexts) remove period
at end of second paragraph and replace with:
; if render_type is set to GLX_RGBA_UNSIGNED_FLOAT_TYPE then a
context that supports unsigned floating point RGBA rendering is
created.
GLX Protocol
None.
Additions to the WGL Specification
Modify the values accepted by WGL_PIXEL_TYPE_ARB to:
WGL_PIXEL_TYPE_ARB
The type of pixel data. This can be set to WGL_TYPE_RGBA_ARB,
WGL_TYPE_RGBA_FLOAT_ARB, WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT,
or WGL_TYPE_COLORINDEX_ARB.
Add this explanation of unsigned floating point rendering:
"Unsigned floating point rendering assumes the framebuffer format has
no sign bits so all component values are non-negative. In contrast,
conventional floating point rendering assumes signed components."
Dependencies on WGL_ARB_pbuffer
Ignore the "Additions to the WGL Specification" section if
WGL_ARB_pbuffer is not supported.
Dependencies on WGL_ARB_pixel_format
The WGL_ARB_pixel_format extension must be used to determine a
pixel format with unsigned float components.
Dependencies on ARB_color_buffer_float
If ARB_color_buffer_float is not supported, replace this amended
sentence from 4.3.2 above
For an RGBA color, if <type> is not one of FLOAT,
UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT,
or if the CLAMP_READ_COLOR_ARB is TRUE, or CLAMP_READ_COLOR_ARB
is FIXED_ONLY_ARB and the selected color (or texture) buffer is
a fixed-point buffer, each component is first clamped to [0,1]."
with
"For an RGBA color, if <type> is not one of FLOAT,
UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT
and the selected color buffer (or texture image for GetTexImage)
is a fixed-point buffer (or texture image for GetTexImage), each
component is first clamped to [0,1]."
Dependencies on EXT_texture_shared_exponent
If EXT_texture_shared_exponent is not supported, delete the reference
to UNSIGNED_INT_5_9_9_9_REV_EXT in section 4.3.2.
Dependencies on EXT_framebuffer_object
If EXT_framebuffer_object is not supported, then
RenderbufferStorageEXT is not supported and the R11F_G11F_B10F_EXT
internalformat is therefore not supported by RenderbufferStorageEXT.
If EXT_framebuffer_object is supported, glRenderbufferStorageEXT
accepts GL_RG11F_B10F_EXT for its internalformat parameter because
GL_RG11F_B10F_EXT has a base internal format of GL_RGB that is listed
as color-renderable by the EXT_framebuffer_object specification.
Errors
Relaxation of INVALID_ENUM errors
---------------------------------
TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D,
and RenderbufferStorageEXT accept the new R11F_G11F_B10F_EXT token
for internalformat.
DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage,
TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D,
GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D,
ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D,
GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable
accept the new UNSIGNED_INT_10F_11F_11F_REV_EXT token for type.
New errors
----------
INVALID_OPERATION is generated by DrawPixels, ReadPixels, TexImage1D,
TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D,
TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D,
ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter,
SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable,
and GetColorTable if <type> is UNSIGNED_INT_10F_11F_11F_REV_EXT and
<format> is not RGB.
New State
In table 6.17, Textures (page 278), increment the 42 in "n x Z42*"
by 1 for the R11F_G11F_B10F_EXT format.
[NOTE: The OpenGL 2.0 specification actually should read "n x Z48*"
because of the 6 generic compressed internal formats in table 3.18.]
(modify table 6.33, p. 294)
Initial
Get Value Type Get Command Value Description Sec. Attribute
-------------------------- ---- ----------- ------- ------------------ ---- ----------
RGBA_SIGNED_COMPONENTS_EXT 4xB GetIntegerv - True if respective 4 -
R, G, B, and A
components are
signed
New Implementation Dependent State
None
Issues
1) What should this extension be called?
RESOLVED: EXT_packed_float
This extension provides a new 3-component packed float format
for use as a texture internal format, pixel external format,
and framebuffer color format.
"packed" indicates the extension is packing components
at reduced precisions (similar to EXT_packed_pixels or
NV_packed_depth_stencil).
EXT_r11f_g11f_b10f_float was considered but there's no precedent
for extension names to be so explicit (or cryptic?) about format
specifics in the extension name.
2) Should there be an rgb11f_b10f framebuffer format?
RESOLVED: Yes. Unsigned floating-point rendering formats for GLX
and WGL are provided. The assumption is that this functionality
could be used to advertise a pixel format with 11 bits of unsigned
floating-point red, 11 bits of unsigned floating-point green,
and 10 bits of floating-point blue.
In theory, an implementation could advertise other component sizes
other than 11/11/10 for an unsigned floating-point framebuffer
format but that is not expected.
3) Should there be GLX and WGL extension strings?
RESOLVED: Yes, there are WGL and GLX tokens added to
support querying unsigned floating-point color buffer
formats named WGL_EXT_pixel_format_packed_float and
GLX_EXT_fbconfig_packed_float respectively.
4) Should there be an unequal distribution of red, green, and blue
mantissa bits?
RESOLVED: Yes. A 6-bit mantissa for red and green is unbalanced
with the 5-bit mantissa for blue, but this allows all the bits of
a 32 bit word (6+6+5+3*5=32) to be used. The blue component is
chosen to have fewer bits because 1) it is the third component,
and 2) there's a belief that the human eye is less sensitive
to blue variations..
Developers should be aware that subtle yellowing or bluing
of gray-scale values is possible because of the extra bit of
mantissa in the red and green components.
5) Should there be an external format for r11f_g11f_b10f?
RESOLVED: Yes. This makes it fast to load GL_R11F_G11F_B10F_EXT
textures without any translation by the driver.
6) What is the exponent bias?
RESOLVED: 15, just like 16-bit half-precision floating-point
values.
7) Can s10e5 floating-point filtering be used to filter
r11f_g11f_b10f values? If so, how?
RESOLVED: Yes. It is easy to promote r11f_g11f_b10f values to
s10e5 components.
8) Should automatic mipmap generation be supported for r11f_g11f_b10f
textures?
RESOLVED: Yes.
9) Should non-texture and non-framebuffer commands for loading
pixel data accept the GL_UNSIGNED_INT_10F_11F_11F_REV_EXT type?
RESOLVED: Yes.
Once the pixel path has to support the new type/format combination
of GL_UNSIGNED_INT_5_9_9_9_REV_EXT / GL_RGB for specifying and
querying texture images, it might as well be supported for all
commands that pack and unpack RGB pixel data.
The specification is written such that the glDrawPixels
type/format parameters are accepted by glReadPixels,
glTexGetImage, glTexImage2D, and other commands that are specified
in terms of glDrawPixels.
10) Should non-texture internal formats (such as for color tables,
convolution kernels, histogram bins, and min/max tables) accept
GL_R11F_G11F_B10F_EXT format?
RESOLVED: No.
That's pointless. No hardware is ever likely to support
GL_R11F_G11F_B10F_EXT internal formats for anything other than
textures and maybe color buffers in the future. This format is
not interesting for color tables, convolution kernels, etc.
11) Should a format be supported with sign bits for each component?
RESOLVED: No. A sign bit for each of the three components would
steal too many bits from the mantissa. This format is intended
for storing radiance and irradiance values that are physically
non-negative.
12) Should we support a non-REV version of the
GL_UNSIGNED_INT_10F_11F_11F_REV_EXT token?
RESOLVED: No. We don't want to promote different arrangements
of the bitfields for r11f_g11f_b10f values.
13) Can you use the GL_UNSIGNED_INT_10F_11F_11F_REV_EXT format with
just any format?
RESOLVED: You can only use the
GL_UNSIGNED_INT_10F_11F_11F_REV_EXT format with GL_RGB.
Otherwise, the GL generates an GL_INVALID_OPERATION error.
Just as the GL_UNSIGNED_BYTE_3_3_2 format just works with GL_RGB
(or else the GL generates an GL_INVALID_OPERATION error), so
should GL_UNSIGNED_INT_10F_11F_11F_REV_EXT.
14) Should blending be supported for a packed float framebuffer
format?
RESOLVED: Yes. Blending is required for other floating-point
framebuffer formats introduced by ARB_color_buffer_float.
The equations for blending should be evaluated with signed
floating-point math but the result will have to be clamped to
non-negative values to be stored back into the packed float
format of the color buffer.
15) Should unsigned floating-point framebuffers be queried
differently from conventional (signed) floating-point
framebuffers?
RESOLVED: Yes. An existing application using
ARB_color_buffer_float can rightfully expect a floating-point
color buffer format to provide signed components. The packed
float format does not provide a sign bit. Simply treating packed
float color buffer formats as floating-point might break some
existing applications that depend on a float color buffer to be
signed.
For this reason, there are new WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT
(for WGL) and GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT (for GLX)
framebuffer format parameters.
16) What should glGet of GL_RGBA_FLOAT_MODE_ARB return for unsigned
float color buffer formats?
RESOLVED. GL_RGBA_FLOAT_MODE_ARB should return true. The packed
float components are unsigned but still floating-point.
17) Can you query with glGet to determine if the color buffer has
unsigned float components?
RESOLVED: Yes. Call glGetIntegerv
on GL_RGBA_SIGNED_COMPONENTS_EXT. The value returned is
a 4-element array. Element 0 corresponds to red, element 1
corresponds to green, element 2 corresponds to blue, and element
3 corresponds to alpha. If a color component is signed, its
corresponding element is true (GL_TRUE). This is the same way
the GL_COLOR_WRITEMASK bits are formatted.
For the packed float format, all the elements are zeroed since
the red, green, and blue components are unsigned and the alpha
component is non-existent. All elements are also zeroed for
conventional fixed-point color buffer formats. Elements are
set for signed floating-point formats such as those introduced
by ARB_color_buffer_float. If a component (such as alpha) has
zero bits, the component should not be considered signed and so
the bit for the respective component should be zeroed.
This generality allows a future extension to specify float
color buffer formats that had a mixture of signed and unsigned
floating-point components. However, this extension only provides
a packed float color format with all unsigned components.
18) How many bits of alpha should GL_ALPHA_BITS return for the packed
float color buffer format?
RESOLVED: Zero.
19) Can you render to a packed float texture with the
EXT_framebuffer_object functionality?
RESOLVED: Yes.
Potentially an implementation could return
GL_FRAMEBUFFER_UNSUPPORTED_EXT when glCheckFramebufferStatusEXT
for a framebuffer object including a packed float color buffer,
but implementations are likely to support (and strongly encouraged
to support) the packed float format for use with a framebuffer
object because the packed float format is expected to be a
memory-efficient floating-point color format well-suited for
rendering, particularly rendering involving high-dynamic range.
20) This extension is for a particular packed float format. What if
new packed float formats come along?
RESOLVED: A new extension could be introduced with a name like
EXT_packed_float2, but at this time, no other such extensions
are expected except for the EXT_texture_shared_exponent
extension. It simply hard to justify packing three or more
components into a single 32-bit word in lots of different ways
since any approach is going to be a compromise of some sort.
For two-component or one-component floating-point formats, the
existing ARB_texture_float formats fit nicely into 16 or 32 bits
by simply using half precision floating-point. If 64 bits are
allowed for a pixel, the GL_RGBA16F_ARB is a good choice.
The packed float format is similar to the format introduced by
the EXT_texture_shared_exponent extension, but that extension
is not a pure packed float format. Unlike the packed float
format, the EXT_texture_shared_exponent format shares a single
exponent between the RGB components rather than providing
an independent exponent for each component. Because the
EXT_texture_shared_exponent uses fewer bits to store exponent
values, more mantissa precision is provided.
21) Should this extension provide pbuffer support?
RESOLVED: Yes. Pbuffers are core GLX 1.3 functionality.
While using FBO is probably the preferred way to render to
r11f_g11f_b10f framebuffers but pbuffer support is natural
to provide. WGL should have r11f_g11f_b10f pbuffer support too.
22) Must an implementation support NaN, Infinity, and/or denorms?
RESOLVED: The preferred implementation is to support NaN,
Infinity, and denorms. Implementations are allowed to flush
denorms to zero, and treat NaN and Infinity values as large
finite values.
This allowance flushes denorms to zero:
0.0, if E == 0 and M != 0
This allowance treats Infinity as a finite value:
2^16 if E == 31 and M == 0
This allowance treats NaN encodings as finite values:
2^16 * (1 + M/64) if E == 31 and M != 0
The expectation is that mainstream GPUs will support NaN,
Infinity, and denorms while low-end implementations such as for
OpenGL ES 2.0 will likely support denorms but neither NaN nor
Infinity.
There is not an indication of how these floating-point special
values are treated (though an application could test an
implementation if necessary).
23) Should this extension interoperate with framebuffer objects?
RESOLVED: Definitely. No particular specification language is
required.
In particular, glRenderbufferStorageEXT should accept
GL_R11F_G11F_B10F_EXT for its internalformat parameter (true
because this extension adds a new format to Table 3.16).
24) Are negative color components clamped to zero when written into
an unsigned floating-point color buffer? If so, do we need to
say in the Blending or Dithering language that negative color
components are clamped to zero?
RESOLVED: Yes, negative color components are clamped to zero when
written to an unsigned floating-point color buffer. No specification
language is required for this behavior because the ARB_color_buffer_float
extension says
"In RGBA mode dithering selects, for each color component, either
the most positive representable color value (for that particular
color component) that is less than or equal to the incoming
color component value, c, or the most negative representable
color value that is greater than or equal to c.
If dithering is disabled, then each incoming color component
c is replaced with the most positive representable color value
(for that particular component) that is less than or equal to c,
or by the most negative representable value, if no representable
value is less than or equal to c;"
The most negative representable value for unsigned
floating-point values is zero. So the existing language from
ARB_color_buffer_float already indicates that negative values
are clamped to zero for unsigned floating-point color buffers.
No additional specification language is required.
25) Prior texture internal formats have generic formats (example:
GL_RGB) and corresponding sized formats (GL_RGB8, GL_RGB10,
etc.). Should we add a generic format corresponding to
GL_R11F_G11F_B10F_EXT?
RESOLVED: No. It's unlikely there will be any other unsigned
floating-point texture formats.
Revision History
None