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. = UNSIGNED_SHORT or 32-bit depth values i.e. = 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 parameter of TexImage2D and TexSubImage2D and parameter of TexImage2D: DEPTH_COMPONENT 0x1902 Accepted by the 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 and values of DEPTH_COMPONENT refer to a texture that contains depth component data. is used to determine the number of bits used to specify depth texel values. A value of UNSIGNED_SHORT refers to a 16-bit depth value. A 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 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 is TEXTURE_2D. Using this format in conjunction with any other 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 = DEPTH_COMPONENT are depth renderable. Errors The error INVALID_OPERATION is generated if the and is DEPTH_COMPONENT and is not UNSIGNED_SHORT, or UNSIGNED_INT. The error INVALID_OPERATION is generated if the and is not DEPTH_COMPONENT and is UNSIGNED_SHORT, or UNSIGNED_INT. The error INVALID_OPERATION is generated if 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.