blob: e15aac2ec26eb38a436a7f7d8e8860e2d823d144 [file] [log] [blame]
Name
OES_depth_texture
Name Strings
GL_OES_depth_texture
Contact
Aaftab Munshi (amunshi@apple.com)
Notice
Copyright (c) 2006-2013 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Specification Update Policy
Khronos-approved extension specifications are updated in response to
issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
extensions which have been promoted to a core Specification, fixes will
first appear in the latest version of that core Specification, and will
eventually be backported to the extension document. This policy is
described in more detail at
https://www.khronos.org/registry/OpenGL/docs/update_policy.php
Status
Ratified by the Khronos BOP, March 20, 2008.
Version
Last Modifed Date: January 29, 2012
Number
OpenGL ES Extension #44
Dependencies
OpenGL ES 2.0 is required.
This extension is written against the OpenGL ES 2.0 specification
Overview
This extension defines a new texture format that stores depth values in
the texture. Depth texture images are widely used for shadow casting but
can also be used for other effects such as image based rendering, displacement
mapping etc.
Issues
1. Should manual generation of mipmaps for a depth texture using GenerateMipmap be supported?
Possible Resolutions:
a) Allow manual generation of mipmaps. This will ensure that GenerateMipmap works
consistently for any texture.
b) Disallow. GenerateMipmap will generate INVALID_OPERATION error for a depth texture.
The reason for this is that doing a low-pass filter to generate depth values for
higher mip-levels of a depth texture does not make sense.
Resolution: Adopt approach b). Manual generation of mipmaps is done by averaging a
2 x 2 region --> 1 texel as we go from one level to the next. This does not make much
sense for depth textures. A better approach would be to take a min or max of 2 x 2 texel
region instead of doing an average. Since min & max filters are not supported by GenerateMipmap,
the WG decided to disallow manual generation of mipmaps for a depth texture.
2. Should GL_DEPTH_TEXTURE_MODE be used to determine whether depth textures are treated as
LUMINANCE, INTENSITY or ALPHA textures during texture filtering and application.
Possible Resolutions:
a) Adopt text from the OpenGL specification.
b) No longer require DEPTH_TEXTURE_MODE. Treat depth textures always as luminance
textures i.e. depth value is returned as (d, d, d, 1.0) by GLSL texture* calls in the
fragment and/or vertex shader.
Resolution: Adopt approach b). We only need to support one way of treating how depth textures
are read by the shader instead of three possible ways as supported by OpenGL. Almost all apps on
desktop that use depth textures treat depth textures as LUMINANCE. Therefore, this extension treats
depth textures always as luminance textures and no longer supports DEPTH_TEXTURE_MODE.
3. How should 24-bit depth texture data be represented when specified in TexImage2D and TexSubImage2D?
Resolution: This is currently not supported. Depth textures can be specified with 16-bit depth
values i.e. <type> = UNSIGNED_SHORT or 32-bit depth values i.e. <type> = UNSIGNED_INT.
4. Are cube-map depth textures implemented by this extension?
Resolution: No. This is defined in OES_depth_texture_cube_map.
A very interesting use case is rendering shadows for a point light.
For a point light, you want to be able to render depth values into a cube-map and then
use this cube-map depth texture as a shadow map to compute % in shadow at each pixel.
The original version of this extension supported cube-map
depth textures, but this was contradicted by OES_packed_depth_stencil which
only supported 2D textures. Some implementations of OES_depth_texture did
not support cube-maps while others did so it was decided to make support for
cube-map depth textures a separate extension.
5. Are 3D depth textures implemented by this extension?
Resolution: This is not supported. We could not come up with any use cases for
3D depth textures. In addition, we can always define a new extension that adds
this specific functionality in the future.
New Procedures and Functions
None
New Tokens
Accepted by the <format> parameter of TexImage2D and TexSubImage2D and
<internalFormat> parameter of TexImage2D:
DEPTH_COMPONENT 0x1902
Accepted by the <type> parameter of TexImage2D, TexSubImage2D:
UNSIGNED_SHORT 0x1403
UNSIGNED_INT 0x1405
Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
Modifications to table 2.9 (Component conversions)
Add the following entries:
GLType Conversion
------- ----------
UNSIGNED_SHORT c / (2^16 - 1)
UNSIGNED_INT c / (2^32 - 1)
NOTE: UNSIGNED_SHORT and UNSIGNED_INT entries already exist in table 2.9 of the
OpenGL ES 2.0 specification and have been added here for clarity.
Additions to Chapter 3, section 3.8 of the OpenGL ES 2.0 specification
Textures with <format> and <internalFormat> values of DEPTH_COMPONENT
refer to a texture that contains depth component data. <type> is used
to determine the number of bits used to specify depth texel values.
A <type> value of UNSIGNED_SHORT refers to a 16-bit depth value.
A <type> value of UNSIGNED_INT refers to a 32-bit depth value.
As per the OpenGL ES spec, there is no guarantee that the OpenGL ES implementation
will use the <type> to determine how to store the depth texture internally.
It may choose to downsample the 32-bit depth values to 16-bit or even 24-bit.
There is currently no way for the application to know or find out how the
depth texture (or any texture) will be stored internally by the OpenGL ES implementation.
Textures with a base internal format of DEPTH_COMPONENT are supported
by texture image specification commands only if <target> is TEXTURE_2D.
Using this format in conjunction with any other <target> will result in
an INVALID_OPERATION error.
CopyTexImage2D and CopyTexSubImage2D are not supported.
Additions to Chapter 4, section 4.4.2 of the OpenGL ES 2.0 specification
Textures of <format> = DEPTH_COMPONENT are depth renderable.
Errors
The error INVALID_OPERATION is generated if the <format> and <internalFormat>
is DEPTH_COMPONENT and <type> is not UNSIGNED_SHORT, or UNSIGNED_INT.
The error INVALID_OPERATION is generated if the <format> and <internalFormat>
is not DEPTH_COMPONENT and <type> is UNSIGNED_SHORT, or UNSIGNED_INT.
The error INVALID_OPERATION is generated if <target> is not TEXTURE_2D.
New State
None.
Revision History
1/17/2006 First Draft.
6/14/2006 CopyTexImage2D and CopyTexSubImage2D are not supported.
7/19/2007 Added Issues section + updates to section 3.8 +
add section on supporting framebuffer texture attachements
for depth textures.
7/30/2007 Update issues section with adopted resolutions.
Updates to the Errors section.
7/31/2007 Updates to conversion table 2.9
9/4/2007 Added item 3 to Issues List.
Resolution for issue 1 changed to b) - decided in ES WG meeting on 8/29/2007.
9/24/2007 Removed UNSIGNED_INT_24_OES. Added reasoning to resolutions in Issues section.
Removed dependencies on OES_depth24 and OES_depth32.
10/20/2007 Added issues 4. and 5.
10/08/2009 Changed INVALID_VALUE to INVALID_OPERATION error (bug 5209).
01/29/2012 Move depth cube map texture support to OES_depth_texture_cube_map.