blob: 24843ef65b0f2b343d4f0a8edf409a02312761a8 [file] [log] [blame]
Name
EXT_texture_sRGB_decode
Name Strings
GL_EXT_texture_sRGB_decode
Contributors
Matt Collins, Apple Inc
Alex Eddy, Apple Inc
Mark Kilgard, NVIDIA
Chris Niederauer, Apple Inc
Richard Schreyer, Apple Inc
Henri Verbeet, CodeWeavers
Brent Wilson, NVIDIA
Jeff Bolz, NVIDIA
Dan Omachi, Apple Inc
Jason Green, TransGaming
Daniel Koch, NVIDIA
Mathias Heyer, NVIDIA
Contact
Matt Collins, Apple Inc (matthew.collins 'at' apple.com)
Status
Shipping on OS X 10.7
Version
Date: November 8, 2017
Revision: 0.91
Number
OpenGL Extension #402
OpenGL ES Extension #152
Dependencies
OpenGL 2.1 or EXT_texture_sRGB requried for OpenGL
OpenGL ES 3.0 or EXT_sRGB are required for OpenGL ES
OpenGL 3.0 or later interacts with this extension.
OpenGL ES 2.0 interacts with this extension.
OpenGL ES 3.0 interacts with this extension.
ARB_bindless_texture interacts with this extension.
ARB_sampler_objects interacts with this extension.
ARB_framebuffer_object interacts with this extension.
EXT_direct_state_access interacts with this extension.
EXT_texture_compression_s3tc interacts with this extension.
EXT_texture_integer interacts with this extension.
EXT_sRGB interacts with this extension.
NV_sRGB_formats interacts with this extension.
NV_generate_mipmap_sRGB interacts with this extension.
KHR_texture_compression_astc_ldr interacts with this extension.
ETC2 texure compression formats interact with this extension.
This extension is written against the OpenGL 2.1 (December 1, 2006)
specification.
Overview
The EXT_texture_sRGB extension (promoted to core in OpenGL 2.1)
provides a texture format stored in the sRGB color space. Sampling one
of these textures will always return the color value decoded into a
linear color space. However, an application may wish to sample and
retrieve the undecoded sRGB data from the texture and manipulate
that directly.
This extension adds a Texture Parameter and Sampler Object parameter to
allow sRGB textures to be read directly, without decoding.
The new parameter, TEXTURE_SRGB_DECODE_EXT controls whether the
decoding happens at sample time. It only applies to textures with an
internal format that is sRGB and is ignored for all other textures.
This value defaults to DECODE_EXT, which indicates the texture
should be decoded to linear color space.
New Procedures and Functions
None
New Tokens
Accepted by the <pname> parameter of TexParameterf, TexParameteri,
TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv,
TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT,
TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT,
TextureParameterIivEXT, TextureParameterIuivEXT,
MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT,
MultiTexParameterivEXT, MultiTexParameterIivEXT,
MultiTexParameterIuivEXT, GetTexParameterfv, GetTexParameteriv,
GetTexParameterIiv, GetTexParameterIuiv, GetTexParameterIivEXT,
GetTexParameterIuivEXT, GetTextureParameterfEXT,
GetTextureParameterfvEXT, GetTextureParameteriEXT,
GetTextureParameterivEXT, GetTextureParameterIivEXT,
GetTextureParameterIuivEXT, GetMultiTexParameterfEXT,
GetMultiTexParameterfvEXT, GetMultiTexParameteriEXT,
GetMultiTexParameterivEXT, GetMultiTexParameterIivEXT,
GetMultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf,
SamplerParameteriv, SamplerParameterfv, SamplerParameterIiv,
SamplerParameterIuiv, GetSamplerParameteriv, GetSamplerParameterfv,
GetSamplerParameterIiv, and GetSamplerParameterIuiv:
TEXTURE_SRGB_DECODE_EXT 0x8A48
Accepted by the <param> parameter of TexParameterf, TexParameteri,
TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv,
TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT,
TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT,
TextureParameterIivEXT, TextureParameterIuivEXT,
MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT,
MultiTexParameterivEXT, MultiTexParameterIivEXT,
MultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf,
SamplerParameteriv, SamplerParameterfv, SamplerParameterIiv, and
SamplerParameterIuiv:
DECODE_EXT 0x8A49
SKIP_DECODE_EXT 0x8A4A
Additions to Chapter 3 of the 2.1 Specification (Rasterization)
Add 1 new row to Table 3.18 (page 169).
Name Type Initial value Legal values
---- ---- ------------- ------------
TEXTURE_SRGB_DECODE_EXT enum DECODE_EXT DECODE_EXT, SKIP_DECODE_EXT
-- OpenGL: Section 3.8.8, Texture Minification
Add to the end of the "Automatic Mipmap Generation" subsection:
If the automatic mipmap generation is applied to a texture
whose internal format is one of SRGB_EXT, SRGB8_EXT,
SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT, SLUMINANCE_ALPHA_EXT,
SLUMINANCE8_ALPHA8_EXT, SLUMINANCE_EXT, SLUMINANCE8_EXT,
COMPRESSED_SRGB_EXT, COMPRESSED_SRGB_ALPHA_EXT,
COMPRESSED_SLUMINANCE_EXT, COMPRESSED_SLUMINANCE_ALPHA_EXT,
COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or
COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, and the TEXTURE_SRGB_DECODE_EXT
parameter for the current texture unit is DECODE_EXT, the RGB
texel components are decoded to a linear components as described
in section 3.8.15 prior to downsampling; then after downsampling,
the linear components are re-encoded as sRGB in the following manner:
If cl is the linear color component, then the corresponding sRGB
encoded component is encoded as follows
{ cl * 12.92, cl < 0.0031308
cs = {
{ 1.055 * cl^0.41666 - 0.055, cl >= 0.0031308
If the automatic mipmap generation is applied to a texture whose
internal format is one of the sRGB formats listed previously and
the TEXTURE_SRGB_DECODE_EXT parameter for the texture object is
SKIP_DECODE_EXT, the sRGB decode and encode steps are skipped during
mipmap generation.
-- OpenGL: Section 3.8.15, sRGB Color Decoding
(section was previously titled sRGB Color Conversion)
Replace current text with the following:
If the currently bound texture's internal format is one
of SRGB_EXT, SRGB8_EXT, SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT,
SLUMINANCE_ALPHA_EXT, SLUMINANCE8_ALPHA8_EXT, SLUMINANCE_EXT,
SLUMINANCE8_EXT, COMPRESSED_SRGB_EXT, COMPRESSED_SRGB_ALPHA_EXT,
COMPRESSED_SLUMINANCE_EXT, COMPRESSED_SLUMINANCE_ALPHA_EXT,
COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or
COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, and the TEXTURE_SRGB_DECODE_EXT
parameter for the current texture unit is DECODE_EXT, the red, green, and blue
components are decoded from an sRGB color space to a linear color
space as part of filtering described in sections 3.8.8 and 3.8.9.
Any alpha component is left unchanged. Ideally, implementations
should perform this color decoding on each sample prior to filtering
but implementations are allowed to perform this decoding after
filtering (though this post-filtering approach is inferior to
decoding from sRGB prior to filtering).
The decoding from an sRGB encoded component, cs, to a linear
component, cl, is as follows
{ 0, cs <= 0
{
{ cs / 12.92, 0 < cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, 0.04045 < cs < 1
{
{ 1, cs >= 1
Assume cs is the sRGB component in the range [0,1].
If the TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT, the value
is returned without decoding. The TEXTURE_SRGB_DECODE_EXT
parameter state is ignored for any texture with an internal format
not explicitly listed above, as no decoding needs to be done.
--- OpenGL ES 3.2: Section 8.21, sRGB Texture Color Conversion
--- OpenGL ES 3.0: Section 3.8.16, sRGB Texture Color Conversion
--- OpenGL ES 2.0: Section 3.7.14, sRGB Texture Color Conversion
Add after the first paragraph of the section:
"The conversion of sRGB color space components to linear color space is
always applied if the TEXTURE_SRGB_DECODE_EXT parameter is DECODE_EXT.
Table X.1 describes whether the conversion is skipped if the
TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT, depending on
the function used for the access, whether the access occurs through a
bindless sampler, and whether the texture is statically accessed
elsewhere with a texelFetch function."
Add a new table X.1, Whether the conversion of sRGB color space
components to linear color space is skipped when the
TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT.
texelFetch other builtin
--------------------------------------------------------------------
non-bindless sampler, n/a yes
no accesses with
texelFetch
non-bindless sampler, no undefined
statically accessed with
texelFetch
bindless sampler undefined yes
Dependencies on ARB_bindless_texture
If ARB_bindless_texture is NOT supported, delete all references to
bindless samplers.
Dependencies on ARB_sampler_objects or OpenGL 3.3 or later
If ARB_sampler_objects or OpenGL 3.3 or later is NOT supported,
delete all references to SamplerParameter* and GetSamplerParameter*.
Dependencies on ARB_framebuffer_object or OpenGL 3.0 or later
If ARB_framebuffer_object or OpenGL 3.0 or later is supported, the
explanation in the "Automatic Mipmap Generation" section applies to
the GenerateMipmap command as well.
Dependencies on EXT_texture_compression_s3tc
If EXT_texture_compression_s3tc is NOT supported, delete
COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, and
COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT from Section 3.8.15.
Dependencies on EXT_texture_integer
If EXT_texture_integer is NOT supported, delete references to
TexParameterIivEXT, TexParameterIuivEXT, GetTexParameterIivEXT,
and GetTexParameterIuivEXT.
Dependencies on EXT_direct_state_access
If EXT_direct_state_access is NOT supported, delete
references to TextureParameterfEXT, TextureParameterfvEXT,
TextureParameteriEXT, TextureParameterivEXT, TextureParameterIivEXT,
TextureParameterIuivEXT, MultiTexParameterfEXT,
MultiTexParameterfvEXT, MultiTexParameteriEXT, MultiTexParameterivEXT,
MultiTexParameterIivEXT, MultiTexParameterIuivEXT,
GetTextureParameterfEXT, GetTextureParameterfvEXT,
GetTextureParameteriEXT, GetTextureParameterivEXT,
GetTextureParameterIivEXT, GetTextureParameterIuivEXT,
GetMultiTexParameterfEXT, GetMultiTexParameterfvEXT,
GetMultiTexParameteriEXT, GetMultiTexParameterivEXT,
GetMultiTexParameterIivEXT, and GetMultiTexParameterIuivEXT.
Dependencies on OpenGL 3.0
If OpenGL 3.0 or later is NOT supported, delete references
to TexParameterIiv, TexParameterIuiv, GetTexParameterIiv,
and GetTexParameterIuiv.
Interactions with OpenGL ES
If OpenGL ES 3.0 is NOT supported, delete references
to TexParameterIiv, TexParameterIuiv, GetTexParameterIiv,
and GetTexParameterIuiv, GetTexParameterfv, GetTexParameteriv.
If OpenGL ES 3.0 or NV_generate_mipmap_sRGB is supported,
TEXTURE_SRGB_DECODE_EXT will control the linearization of sRGB
texture levels while generating the mipmap levels. The section
"Automatic Mipmap Generation" applies to glGenerateMipmap instead.
If neither OpenGL ES 3.0 nor NV_sampler_objects is supported,
delete all references to SamplerParameter* and GetSamplerParameter*.
If NV_sampler_objects is supported, substitue the ARB_sampler_objects
references with corresponding commands of NV_sampler_objects.
Interactions with KHR_texture_compression_astc_ldr
If KHR_texture_compression_astc_ldr is supported, the
TEXTURE_SRGB_DECODE_EXT texture and/or sampler parameter affects the
COMPRESSED_SRGB8_ALPHA8_ASTC_*_KHR formats as described in the Section
3.8.16 edits.
Interactions with ETC2 compressed texture formats
If the ETC2 texture compression formats (part of OpenGL ES 3.0 and OpenGL
4.3) are supported, the TEXTURE_SRGB_DECODE_EXT texture and/or sampler
parameter affects the COMPRESSED_SRGB8_*ETC2* formats as described in the
Section 3.8.16 edits.
Interactions with NV_sRGB_formats
If NV_sRGB_formats is supported, the TEXTURE_SRGB_DECODE_EXT texture and/or
sampler parameter affects the new SRGB and SLUMINANCE formats as described
in the Section 3.7.14 edits.
Errors
INVALID_ENUM is generated if the <pname> parameter of
TexParameter[i,f,Ii,Iui][v][EXT], MultiTexParameter[i,f,Ii,Iui][v]EXT,
TextureParameter[i,f,Ii,Iui][v]EXT, SamplerParameter[i,f,Ii,Iui][v]
is TEXTURE_SRGB_DECODE_EXT when the <param> parameter is not one of
DECODE_EXT or SKIP_DECODE_EXT.
New State
In table 6.20, Texture Objects, p. 384, add the following:
Get Value Type Get Command Initial Value Description Sec. Attribute
---------------------------- ---- -------------------- ------------- ---------------- ----- ---------
TEXTURE_SRGB_DECODE_EXT Z_2 GetTexParameter[if]v DECODE_EXT indicates when 3.8.15 texture
sRGB textures
are decoded from
sRGB or the
decoding step is
skipped
Add to Table 6.23 of ARB_sampler_objects, "Textures (state per sampler object)":
Get Value Type Get Command Initial Value Description Sec. Attribute
---------------------------- ---- ------------------------ ------------- ---------------- ----- ---------
TEXTURE_SRGB_DECODE_EXT Z_2 GetSamplerParameter[if]v DECODE_EXT indicates when 3.8.15 texture
sRGB textures
are decoded from
sRGB or the
decoding step is
skipped
Issues
1) What should this extension be called?
RESOLVED: EXT_texture_sRGB_decode
The purpose of this extension is to allow developers to skip
the sRGB-to-linear decoding detailed in Section 3.8.15.
Since this is a decoding of the sRGB value into linear space, we
use that word to describe the pname. The enum indicating this
decoding is to happen is DECODE, as that is what the GL will do.
The enum that indicates this decoding is to be skipped is then
appropriately, SKIP_DECODE.
2) Should this allow for filters other than NEAREST on undecoded
sRGB values?
RESOLVED: YES
Hardware supports this, and it is left up to the programmer.
3) Do we generate an error if TEXTURE_SRGB_DECODE_EXT is changed for normal
textures?
RESOLVED: NO
This is similar to the ARB_shadow and ARB_framebuffer_sRGB extensions - the flag
is ignored for non-sRGB texture internal formats.
4) Should we add forward-looking support for ARB_sampler_objects?
RESOLVED: YES
If ARB_sampler_objects exists in the implementation, the sampler
objects should also include this parameter per sampler.
5) What is the expense of changing the sRGB-ness of a texture without
this extension?
RESOLVED: If an application wants to use a texture with sRGB
texels and then switch to using it with linear filtering (or vice
versa), OpenGL without this extension requires the application
to read back all the texels in all the mipmap levels of all the
images, and respecify a different texture object with a different
texture format. This is very expensive.
With this extension, the driver can simply change the underlying
hardware texture format associated with the texture to perform
sRGB conversion on filtering or not. This is very inexpensive.
However, note that the functionality of this extension can also
be obtained using the more modern approach provided by
ARB_texture_view (added to OpenGL 4.3) and OES_texture_view.
6) Do any major games or game engines depend on the ability to
change the sRGB-ness of textures?
RESOLVED: Yes, Valve's Source engine used by Half-Life 2,
Counter-Strike: Source, and Left 4 Dead; and Unreal Engine 3
games including Unreal Tournament 3 and BioShock.
These games and their underlying engines repeatedly render linear
color values into textures and then texture from the rendered
textures with sRGB texture filtering.
7) Why not simply allow changing whether a standard GL_RGBA8
can perform an sRGB color space conversion for filtering?
RESOLVED: Allowing this would create a consistency problem.
Why would the GL_TEXTURE_SRGB_DECODE_EXT parameter not
apply to GL_RGB4 or GL_RGB12 textures too? In practice,
sRGB color conversion for texture filtering is only typically
supported in hardware for a small subset of texture formats
(corresponding to the sized internal formats introduced by the
EXT_texture_sRGB specification). It's essentially only 8-bit
fixed-point unsigned textures where sRGB color conversion makes
sense. And the initial value of the parameter (GL_DECODE_EXT) would be
appropriate for sRGB texture formats but not conventional linear
texture formats (as no decoding needs to be done). Having the
texture parameter apply just to sRGB texture eliminates the ambiguity
of which conventional texture formats can and cannot have sRGB decoding
applied to them. This also eliminates the burden of having every future
texture format extension specify whether or not the sRGB decoding parameter
applies to them.
Direct3D 9 handles this situation by advertising for each surface
format (which double as texture formats) a D3DUSAGE_QUERY_SRGBREAD
parameter. In practice, Direct3D 9 implementation only advertise
the D3DUSAGE_QUERY_SRGBREAD parameter for 8-bit fixed-point
unsigned RGB or luminance formats, corresponding to the formats
available from EXT_texture_sRGB.
8) Does there need to be a control for whether to update (and
possibly blend) framebuffer pixels in sRGB or linear color space?
RESOLVED: The EXT_framebuffer_sRGB extension (made core in OpenGL
3.0) already has this capability with the GL_FRAMEBUFFER_SRGB_EXT
enable.
The GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING query parameter
roughly corresponds to Direct3D 9's D3DUSAGE_QUERY_SRGBWRITE
parameter.
9) How is the border color handled when toggling sRGB color
conversion for blending of sRGB textures?
RESOLVED: Consistent with the EXT_texture_sRGB specification, the
border color is always specified as a linear value (never sRGB).
So changing the TEXTURE_SRGB_DECODE_EXT parameter will
not affect the resulting sampled border color.
If an implementation were to store the texture border color in a
format consistent with the texel format (including the sRGB color
space), this would require such implementations to convert the
(linear) texture border RGB components to sRGB space.
In this case, this would mean an implementation to re-specify
the texture border color state in the hardware when the
TEXTURE_SRGB_DECODE_EXT parameter for an sRGB texture
changed.
Alternatively, if the implementation stored the texture
border color in texture formant-independent format (say 4
floating-point values) and always treated this as a linear RGB
color for purposes of texture filtering, no sRGB conversion
of the texture border color would ever occur. In this case,
this would mean an implementation would NOT need to re-specify
the texture border color state in the hardware when the
TEXTURE_SRGB_DECODE_EXT parameter for an sRGB texture
changed.
10) How is mipmap generation of sRGB textures affected by the
TEXTURE_SRGB_DECODE_EXT parameter?
RESOLVED: When the TEXTURE_SRGB_DECODE parameter is DECODE_EXT
for an sRGB texture, mipmap generation should decode sRGB texels
to a linear RGB color space, perform downsampling, then encode
back to an sRGB color space. (Issue 24 in the EXT_texture_sRGB
specification provides a rationale for why.) When the parameter
is SKIP_DECODE_EXT instead, mipmap generation skips the encode
and decode steps during mipmap generation. By skipping the
encode and decode steps, sRGB mipmap generation should match
the mipmap generation for a non-sRGB texture.
The TEXTURE_SRGB_DECODE_EXT texture parameter has no effect on
mipmap generation of non-sRGB textures.
Direct3D 10 and Direct3D 11 expect mipmap generation for sRGB
textures to be "correctly done" (meaning sRGB decode samples,
perform weighted average in linear space, then sRGB encode
the result).
Direct3D 9 expects to NOT perform sRGB-correct mipmap generation.
Hence the ability to generate mipmaps from an sRGB texture
where you skip the decode (and encode) during mipmap generation
is important.
11) Does automatic mipmap generation change the smaller mipmap levels
when the TEXTURE_SRGB_DECODE texture parameter changes?
RESOLVED: No, automatic mipmap generation only happens when the
base level is changed.
This means if the TEXTURE_SRGB_DECODE parameter is changed from
DECODE_EXT to SKIP_DECODE_EXT (or vice versa), the texels in the
smaller mipmap levels are not modified.
Use the glGenerateMipmap command to regenerate mipmaps explicitly
to reflect a change in the TEXTURE_SRGB_DECODE parameter.
12) How is this extension expected to be used for Direct3D 9 emulation?
RESOLVED: Direct3D texture resources that are created with a
format supporting either the SRGBREAD or SRGBWRITE capabilities
should be created as an OpenGL texture object with an sRGB
internal format.
This means that normal "linear" RGBA8 textures for Direct3D 9
should be created as GL_SRGB8_ALPHA8 textures so they can be used
with samplers where the GL_TEXTURE_SRGB_DECODE_EXT parameter of
the sampler (assuming ARB_sampler_objects) determines whether
they operate as linear textures (the GL_SKIP_DECODE_EXT) state
or sRGB textures (the GL_DECODE_EXT state).
Example for a Direct3D9 CreateTexture with a D3DFMT_A8R8G8B8 format:
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8,
width, height, border, GL_UNSIGNED_BYTE, GL_RGBA, texels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
Notice the texture is created with a GL_SRGB_ALPHA8 format but
immediately switched to GL_SKIP_DECODE_EXT. This is because:
1a) The format needs to be GL_SRGBA_ALPHA so that when used with
a sampler configured with the (initial) value of zero (false)
for D3DSAMP_SRGBTEXTURE, the texture will be filtered without
sRGB decode.
1b) Likewise, when D3DSAMP_SRGBTEXTURE is true for a sampler, the
texture needs to be decoded to sRGB for filtering. In this case,
the OpenGL translation would use:
glSamplerParameteri(sampler, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
2) Direct3D9's D3DUSAGE_AUTOGENMIPMAP does not generate mipmaps
in sRGB space (but rather in linear space).
When rendering into a surface in Direct3D 9 with the
D3DRS_SRGBWRITEENABLE render state (set by SetRenderState) set to false,
the pixel updates (including blending) need to operate with
GL_FRAMEBUFFER_SRGB disabled. So:
glDisable(GL_FRAMEBUFFER_SRGB);
Likewise when the D3DRS_SRGBWRITEENABLE render state is true,
OpenGL should operate
glEnable(GL_FRAMEBUFFER_SRGB);
Any texture with an sRGB internal format (for example,
GL_SRGB8_ALPHA8 for the internal format) will perform sRGB decode
before blending and encode after blending. This matches the Direct3D9
semantics when D3DUSAGE_QUERY_SRGBWRITE is true of the resource format.
13) How is this extension expected to be used for Direct3D 10 and
11 emulation?
RESOLVED: Direct3D 10 and 11 support non-mutable formats for sRGB
textures (matching the original behavior of EXT_texture_sRGB,
unextended by this extension). So the DXGI_FORMAT_*_SRGB
formats are always decoded from sRGB to linear (and vice versa)
as necessary. Formats not suffixed with _SRGB are never decoded
or encoded to sRGB.
Direct3D 10 and 11 support "typeless" resources with resource views
that can have different formats. So you can create a texture
with a format of DXGI_FORMAT_R8G8B8A8_TYPELESS and then create
shader resource views with the DXGI_FORMAT_R8G8B8A8_UNORM and
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB formats on that. This is a much
more generic approach to decoupling storage and interpretation in
Direct3D 10 and 11. However support for "typeless" resources
and resource views is beyond the scope of this extension.
These two questions from Microsoft's Direct3D 10 Frequently Asked
Questions list provide helpful context:
"Q: Where did the D3DSAMP_SRGBTEXTURE state go?
A: SRGB was removed as part of the sampler state and now
is tied to the texture format. Binding an SRGB texture will
result in the same sampling you would get if you specified
D3DSAMP_SRGBTEXTURE in Direct3D 9.
Q: What are these new SRGB formats?
A: SRGB was removed as part of the sampler state and is
now tied to the texture format. Binding an SRGB texture will
result in the same sampling you would get if you specified
D3DSAMP_SRGBTEXTURE in Direct3D 9."
This means that normal "linear" textures, such as
DXGI_FORMAT_R8G8B8A8_UNORM, would be created as GL_RGBA8 textures
(not sRGB), so that they will always behave as linear textures
(never sRGB-decoded).
On the other hand, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB would be
created as GL_SRGB8_ALPHA8. Its texture sRGB decode parameter
would be left with the initial value of GL_DECODE_EXT. Mipmap
generation for a texture using DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
(GL_RGB8_ALPHA8 in OpenGL) would perform the proper sRGB decode
and encode needed for automatic mipmap generation.
In Direct3D 10 and 11 emulation, the GL_TEXTURE_SRGB_DECODE_EXT
parameter of sampler objects would simply be left at its initial
value of GL_DECODE_EXT. Unlike Direct3D 9 where the sampler
controlled sRGB decode (via the D3DSAMP_SRGBTEXTURE), that parameter
is not present in Direct3D 10 and 11 (see the FAQ questions above).
The conclusion of this issue's discussion is that Direct3D
10 and 11 emulation software should simply ignore the
EXT_texture_sRGB_decode extension. This is to be expected
because the EXT_texture_sRGB_decode extension is meant to match
the legacy functionality of Direct3D 9.
14) Why does Table X.1 show "Undefined", and why does it appear in
different columns depending on whether bindless samplers are used
or not?
RESOLVED: Conceptually, TEXTURE_SRGB_DECODE_EXT is part of the
sampler state and should therefore not apply to texelFetch. However,
not all hardware has the required bit in the sampler state.
With bindless samplers, texture handles are *always* statically
accessed by texelFetch (because an application could choose to do so
at any time), so applying the same rules as for non-bindless
samplers would make the functionality provided in this extension
useless.
Revision History
Rev. Date Author Changes
---- -------- -------- -------------------------------------
0.91 11/08/17 nhaehnle Add interaction with bindless textures
(API issue #51)
0.90 04/27/16 Jon Leech Add interaction with texelFetch builtins
(Bug 14934)
0.89 08/14/13 dkoch Add interactions with ASTC/ETC2/NV_sRGB_formats
0.88 07/24/13 mheyer Add OpenGL ES interactions
0.87 08/22/11 mjk correction to issue #8 from Jason
0.86 08/22/11 mjk corrections from Daniel + more interactions
0.85 08/13/11 mjk corrections to issues from Jason and Henri
0.84 08/05/11 mjk New issues to explain Direct3D interactions;
fix table Get Command.
0.83 07/15/11 mjk "current texture unit" -> "texture
object" for mipmap generation
0.82 04/12/11 mjk Mipmap generation interactions.
0.81 11/18/10 mattc Fixed language in error section.
Cleaned up which functions take which tokens.
0.8 11/18/10 mattc Added issues from EXT_texture_sRGB_decode
for background info. Cleaned up layout.
0.71 11/18/10 mattc Adapted apple_texture_linearize_srgb into
this specification.