blob: 57d56f7759c6b288bd6a30f1200aff29ccbfde9b [file] [log] [blame]
Name
NV_render_depth_texture
Name Strings
WGL_NV_render_depth_texture
Contact
Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)
Notice
Copyright NVIDIA Corporation, 2001, 2002.
Status
Shipping, March 2002.
Version
Last Modified Date: 2003/01/08
NVIDIA Revision: 1
Number
263
Dependencies
OpenGL 1.1 is required.
ARB_render_texture is required.
SGIX_depth_texture is required.
NV_render_texture_rectangle affects the definition of this extension.
Overview
This extension allows a depth buffer to be used for both rendering and
texturing. It is built upon the ARB_render_texture extension; the only
addition in this extension is the ability to use a depth buffer as a
DEPTH_COMPONENT texture map.
Issues
In the ARB_render_texture spec, the number and size of physical depth
buffers in a rendered texture is left undefined. From the
ARB_render_texture specification:
The contents of the depth and stencil buffers may not be preserved
when rendering a texture to the pbuffer and switching which image
of the texture is rendered to (e.g., switching from rendering one
mipmap level to rendering another).
That behavior is clearly unacceptable in an implementation where the
rendered texture IS the depth buffer.
RESOLVED: Yes, it needs to be fixed. This extension specifies that
each mipmap level and cube map face gets its own depth buffer, whose
contents are preserved when switching render targets.
Should there be separate pixel format attributes for BIND_TO_TEXTURE_DEPTH
and BIND_TO_TEXTURE_RECTANGLE_DEPTH? Or is a single attribute sufficient?
RESOLVED: We should support separate capabilities, as done with the
other formats. See the NV_render_texture_rectangle spec for more info.
Should it be possible to have a single pbuffer support binding both color
and depth buffers to textures?
RESOLVED: Yes. This means that we must provide a separate
DEPTH_TEXTURE_FORMAT attribute that must be set at pbuffer creation
time, since using only the TEXTURE_FORMAT attribute would allow you to
create a pbuffer supporting either color or depth textures, but not
both.
For double-buffered or stereo pixel formats that support binding to depth
textures, how many depth buffers do you have?
RESOLVED: There is only a single depth buffer for double-buffered or
stereo pixel formats. Double buffering refers only to the number of
color buffers. There will be multiple depth buffers only if the pbuffer
is specified to support mipmaps or cube maps.
What happens with multisample pixel formats, where the only depth buffer
contains multiple samples per pixel? This issue is slightly different for
rendered depth textures, since multisample pixel formats do contain
"normal" color buffers in addition to the multisample buffer.
UNRESOLVED.
New Procedures and Functions
None.
New Tokens
Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB,
wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList>
parameters of wglChoosePixelFormatARB:
WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
Accepted by the <piAttribList> parameter of wglCreatePbufferARB and
by the <iAttribute> parameter of wglQueryPbufferARB:
WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
Accepted as a value in the <piAttribList> parameter of wglCreatePbufferARB
and returned in the value parameter of wglQueryPbufferARB when
<iAttribute> is WGL_DEPTH_TEXTURE_FORMAT_NV:
WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
WGL_NO_TEXTURE_ARB 0x2077
Accepted by the <iBuffer> parameter of wglBindTexImageARB:
WGL_DEPTH_COMPONENT_NV 0x20A7
Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation)
None.
Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization)
None.
Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment
Operations and the Frame Buffer)
None.
Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)
None.
Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State
Requests)
None.
Additions to the WGL Specification
First, close your eyes and pretend that a WGL specification actually
existed. Maybe if we all concentrate hard enough, one will magically
appear.
(Add to the description of <piAttributes> in wglGetPixelFormatAttribivARB
and <pfAttributes> in wglGetPixelFormatfv:)
WGL_BIND_TO_TEXTURE_DEPTH_NV
WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV
True if the depth buffer can be bound to a DEPTH_COMPONENT texture or
texture rectangle. Currently only pbuffers can be bound as textures
so this attribute will only be TRUE if WGL_DRAW_TO_PBUFFER is also
TRUE.
(Add new table entries to match criteria in description of
wglChoosePixelFormatARB:)
Attribute Type Match Criteria
WGL_BIND_TO_TEXTURE_DEPTH_NV boolean exact
WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV boolean exact
(In the wglCreatePbufferARB section, modify the attribute list)
WGL_TEXTURE_FORMAT_ARB
This attribute indicates the base internal format of the texture that
will be created when a color buffer of a pbuffer is bound to a texture
map. It can be set to WGL_TEXTURE_RGB_ARB (indicating an internal
format of RGB), WGL_TEXTURE_RGBA_ARB (indicating a base internal
format of RGBA), or WGL_NO_TEXTURE_ARB. The default value is
WGL_NO_TEXTURE_ARB.
WGL_DEPTH_TEXTURE_FORMAT_NV
This attribute indicates the base internal format of the texture that
will be created when the depth buffer of a pbuffer is bound to a
texture map. It can be set to WGL_TEXTURE_DEPTH_COMPONENT_NV
(indicating an internal format of DEPTH_COMPONENT), or
WGL_NO_TEXTURE_ARB. The default value is WGL_NO_TEXTURE_ARB.
(In the wglCreatePbufferARB section, modify the discussion of what happens
to the depth/stencil/accum buffers when switching between mipmap levels or
cube map faces.)
For pbuffers with a texture format of WGL_TEXTURE_RGB_ARB or
WGL_TEXTURE_RGBA_ARB, there will be a separate set of color buffers for
each mipmap level and cube map face in the pbuffer. Otherwise, the WGL
implementation is free to share a single set of color, auxillary, and
accumulation buffers between levels or faces.
For pbuffers with a depth texture format of
WGL_TEXTURE_DEPTH_COMPONENT_NV, there will be a separate depth buffer for
each mipmap level and cube map face. Otherwise, the WGL implementation is
free to share a single depth buffer between levels or faces.
The contents of any color or depth buffer that may be shared between faces
are undefined after switching between mipmap levels or cube map faces.
(In the wglCreatePbufferARB section, add to the error list)
ERROR_INVALID_DATA WGL_DEPTH_TEXTURE_FORMAT_NV is
WGL_TEXTURE_DEPTH_COMPONENT_NV,
WGL_TEXTURE_TARGET_ARB is
WGL_TEXTURE_RECTANGLE_NV, and the
WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV
attribute is not set in the pixel format.
ERROR_INVALID_DATA WGL_DEPTH_TEXTURE_FORMAT_NV is
WGL_TEXTURE_DEPTH_COMPONENT_NV,
WGL_TEXTURE_TARGET_ARB is not
WGL_TEXTURE_RECTANGLE_NV, and the
WGL_BIND_TO_TEXTURE_DEPTH_NV attribute is not
set in the pixel format.
(In the wglCreatePbufferARB section, modify the error list, replacing the
errors concerning texture format/target combinations with the following.)
ERROR_INVALID_DATA WGL_TEXTURE_TARGET_ARB is WGL_NO_TEXTURE_ARB
and either WGL_TEXTURE_FORMAT_ARB or
WGL_DEPTH_TEXTURE_FORMAT_NV is not
WGL_NO_TEXTURE_ARB.
ERROR_INVALID_DATA WGL_TEXTURE_TARGET_ARB is not
WGL_NO_TEXTURE_ARB and both
WGL_TEXTURE_FORMAT_ARB and
WGL_DEPTH_TEXTURE_FORMAT_NV are
WGL_NO_TEXTURE_ARB.
Modify wglDestroyPbufferARB:
A pbuffer is destroyed by calling
BOOL wglDestroyPbufferARB(HPBUFFERARB hPbuffer);
The pbuffer is destroyed once it is no longer current to any rendering
context and once all color and depth buffers that are bound to a
texture object have been released. When a pbuffer is destroyed, any
memory resources that are attached to it are freed and its handle is
no longer valid.
....
Modify wglBindTexImageARB:
...
The pbuffer attribute WGL_DEPTH_TEXTURE_FORMAT_NV determines the base
internal format of the depth texture. The format-specific component
sizes are also determined by pbuffer attributes as shown in the table
below. The component sizes are dependent on the format of the
texture.
Texture Component Size Format
D WGL_DEPTH_BITS_ARB DEPTH_COMPONENT
Table x.x: Size of texture components
...
The possible values for <iBuffer> are WGL_FRONT_LEFT_ARB,
WGL_FRONT_RIGHT_ARB, WGL_BACK_LEFT_ARB, WGL_BACK_RIGHT_ARB,
WGL_DEPTH_COMPONENT_NV, and WGL_AUX0_ARB through WGL_AUXn_ARB.
...
(Modify paragraphs in wglBindTexImageARB section to include language about
allowing depth buffers)
Note that the color or depth buffer is bound to a texture object. If the
texture object is shared between contexts, then the color or depth buffers
are also shared. If a texture object is deleted before
wglReleaseTexImageARB is called, then the color buffer is released and the
pbuffer is made available for reading and writing.
It is not an error to call TexImage2D, TexImage1D, CopyTexImage1D or
CopyTexImage2D to replace an image of a texture object that has a color or
depth buffer bound to it. However, these calls will cause the color or
depth buffers to be released back to the pbuffer and new memory will be
allocated for the texture. Note that the color or depth buffer is released
even if the image that is being defined is a mipmap level that was not
defined by the color buffer.
(Modify wglReleaseTexImageARB section to include language allowing the
binding of depth buffers)
To release a color or depth buffer that is being used as a texture call
BOOL wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer)
This releases the specified color or depth buffer back to the pbuffer. The
pbuffer is made available for reading and writing when it no longer has
any color or depth buffers bound as textures.
<iBuffer> must be one of WGL_FRONT_LEFT_ARB, WGL_FRONT_RIGHT_ARB,
WGL_BACK_LEFT_ARB, WGL_BACK_RIGHT_ARB, WGL_DEPTH_COMPONENT_NV, or
WGL_AUX0_ARB through WGL_AUXn_ARB.
The contents of the color or depth buffer being released are undefined
when it is first released. In particular, there is no guarantee that the
texture image is still present. However, the contents of other color,
depth, stencil, or accumulation buffers are unaffected when the color or
depth buffer is released.
If the specified color or depth buffer is no longer bound to a texture
(e.g., because the texture object was deleted) then this call is a noop;
no error is generated.
After a color or depth buffer is released from a texture (either
explicitly by calling wglReleaseTexImageARB or implicitly by calling a
routine such as TexImage2D), all texture images that were defined by the
color buffer become NULL (it is as if TexImage was called with an image of
zero width).
New State
None
Dependencies on NV_render_texture_rectangle
If NV_render_texture_rectangle is not supported, all references to texture
rectangles and WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV should be deleted.
Revision History
None