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
