| Name |
| |
| ARB_render_texture |
| |
| Name Strings |
| |
| WGL_ARB_render_texture |
| |
| Contact |
| |
| Bimal Poddar, Intel, bimal.poddar@intel.com |
| Paula Womack, Nvidia, PWomack@nvidia.com |
| |
| Notice |
| |
| Copyright (c) 2001-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 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 |
| |
| Complete. Approved by ARB on June 13, 2001 |
| |
| Version |
| |
| Last Modified Date: July 16, 2001 |
| |
| Number |
| |
| ARB Extension #20 |
| |
| Dependencies |
| |
| OpenGL 1.1 is required. |
| WGL_ARB_extension_string is required. |
| WGL_ARB_pixel_format is required. |
| WGL_ARB_pbuffer is required. |
| WGL_ARB_make_current_read affects the definition of this extension. |
| GL_ARB_texture_cube_map affects the definition of this extension |
| The extension is written against the OpenGL 1.2.1 Specification. |
| |
| Overview |
| |
| This extension allows a color buffer to be used for both rendering and |
| texturing. When a color buffer is bound to a texture target it cannot |
| be rendered to. Once it has been released from the texture it can be |
| rendered to once again. |
| |
| This extension may provide a performance boost and reduce memory |
| requirements on architectures that support rendering to the same |
| memory where textures reside and in the same memory format and layout |
| required by texturing. The functionality is similar to CopyTexImage1D |
| and CopyTexImage2D. However, some changes were made to make it easier |
| to avoid copying data: |
| |
| - Only color buffers of a pbuffer can be bound as a texture. It is |
| not possible to use the color buffer of a window as a texture. |
| |
| - The texture internal format is determined when the color buffer |
| is associated with the texture, guaranteeing that the color |
| buffer format is equivalent to the texture internal format. |
| |
| - When a color buffer of a pbuffer is being used as a texture, |
| the pbuffer can not be used for rendering; this makes it |
| easier for implementations to avoid a copy of the image |
| since the semantics of the pointer swap are clear. |
| |
| - The application must release the color buffer from the texture |
| before it can render to the pbuffer again. When the color buffer |
| is bound as a texture, draw and read operations on the pbuffer |
| are undefined. |
| |
| - A mipmap attribute can be set, in which case memory will be |
| allocated up front for mipmaps. The application can render |
| the mipmap images or, if SGIS_generate_mipmap is supported, |
| they can be automatically generated when the color buffer is |
| bound as a texture. |
| |
| - A texture target is associated with the pbuffer, so that cubemap |
| images can be rendered into a single color buffer. |
| |
| Note that this extension may be used in conjunction with other |
| extensions to associate video images/buffers to pbuffers. Once the |
| video image is associated with a pbuffer it can be used as a texture. |
| Also, if SGIX_generate_mipmap is supported, it is possible to |
| create a complete set of mipmap images from a single color buffer. |
| |
| IP Status |
| |
| There are no known IP issues. |
| |
| Issues |
| |
| 1. Should we support 3D textures? What about 1D textures? |
| |
| 3D textures - No. This adds a lot of implementation burden without |
| having a good usage model. |
| |
| 1D textures - Yes. Just a special case of 2D texture. |
| |
| 2. Should we allow a portion of the color buffer to be used as a texture? |
| No, if a different size texture is needed the application can just |
| create another pbuffer. |
| |
| 3. Do we need the MIPMAP_TEXTURE attribute? |
| |
| Yes this is good to have since some architectures may require all or |
| some of the mipmaps to be stored together in memory. |
| |
| 4. Should we require power of 2 textures? |
| |
| Yes, we will allow an implementation to fail if the texture size is |
| not a power of 2. This restriction can be relaxed later by the |
| exension that allows non-power of 2 texture. |
| |
| 5. Should the render texture attributes be per color buffer or per drawable? |
| |
| There really isn't a mechanism for associating attributes with the color |
| buffer. Also, allowing different render texture attributes for each |
| color buffer makes the extension more difficult to implement without |
| providing a very useful tool for applications. |
| |
| 6. What should happen if the color buffer is used for rendering before it |
| is released from the texture? |
| |
| There are three reasonable options: generate an error, create another |
| buffer or have the rendering results be undefined. Since this is an |
| error condition, and not a useful feature, we should pick the option |
| that is easiest to implement. For now, we choose to have the rendering |
| results be undefined--the rendering commands will be processed and the |
| context will be updated but the pbuffer may or may not be updated. |
| Note that the pbuffer that contains the color buffer can be bound to a |
| different context, so the invalid state must be stored with the pbuffer, |
| not the context.. (Also the texture object that contains the |
| color buffer's image may be released from the current context). |
| |
| 7. Should the new pbuffer attributes be available through GL queries? |
| |
| No, like other pbuffer attributes you need to query them through the |
| window system extension. This extension does not make any changes to |
| OpenGL. |
| |
| 8. Should we allow a subset of mipmaps to be defined? |
| |
| No. |
| |
| 9. What happens when a pbuffer is bound as a texture and then a mode |
| change occurs and the pbuffer is lost? |
| |
| The texture is not lost in this case. OpenGL doesn't have the notion |
| of volatile textures and this extension should not introduce them. |
| (It may be an interesting additional extension). When a color buffer |
| is bound to a texture, it must be saved and restored by the driver, |
| whenever texture memory is lost (even on a windows mode change). |
| |
| 10. Should there be any restrictions on the texture operations that |
| can be performed on a color buffer? |
| |
| Yes. We allow TexSubImage and CopyTexSubImage calls but disallow |
| TexImage and CopyTexImage calls. When a TexImage or CopyTexImage call |
| is made then the color buffer is released back to the pbuffer and |
| new memory is allocated for the texture. No mixing and matching of |
| images is allowed. In other words, it is not possible to render a |
| non-mipmapped image to a pbuffer, bind it to a texture and then |
| call TexImage2D to create the other mipmap levels. Modifying any |
| mipmap level via TexImage or CopyTexImage will cause the color |
| buffer to be released back to the pbuffer, even if that level |
| was not defined by the color buffer. |
| |
| Also, if DeleteTextures is called on the texture target, then the |
| color buffer that is bound to the texture target is released back |
| to the pbuffer. |
| |
| The implicit release of the color buffer is intended to work just |
| like an explicit release - i.e. the color buffer is available for |
| rendering without the app having to call ReleaseTexImage. |
| |
| 11. When the color buffer is released from the texture (back to the pbuffer) |
| should the contents be preserved? |
| |
| No, this may prove difficult to implement on some architectures. |
| |
| 12. Should releasing the color buffer from the texture (back to the pbuffer) |
| affect the scissor or viewport? |
| |
| No, since releasing the color buffer, does not change its size, it |
| should not affect the scissor or viewport. The application is also |
| responsible for updating the viewport and scissor when changing which |
| mipmap level it is rendering to (this is similar to window resize, |
| where the application is responsible for updating the scissor and |
| viewport). |
| |
| 13. How should swap buffers work when a color buffer is bound as a texture? |
| |
| Since a color buffer (not a pbuffer) is bound to a texture, swap buffers |
| should be a no-op. Otherwise the name of the bound buffer (FRONT, BACK) |
| will change while it is bound. Note that swap buffers works just as |
| for a pbuffer when the color buffer is not bound as a texture. |
| |
| 14. What happens when the application binds one color buffer of a pbuffer |
| to a texture and then tries to render to another color buffer of the |
| pbuffer? |
| |
| If any of the pbuffer's color buffers are bound to a texture, then |
| rendering results are undefined for all color buffers of the pbuffer. |
| |
| 15. Should it be an error to bind a color buffer of a pbuffer to a |
| texture, if that pbuffer is current to another thread? |
| |
| No. It is not an error to make a drawable current to two threads right |
| now. Read and draw operations produce indeterminate results when the |
| pbuffer is bound to a texture. |
| |
| 16. Should we allow color buffers of all drawables (pbuffers and windows) |
| to be bound to textures? |
| |
| For now we just allow pbuffers. This is simpler since they are not |
| shared with the window system and the color buffers are not part of the |
| visible framebuffer. Also, windows can be resized at any time and |
| handling this resize would unnecessarily complicate this extension. |
| |
| 17. Should we allow depth buffers to be bound as textures? |
| |
| This extension does not provide for this but it would be an interesting |
| additional extension. When a color buffer is bound to a texture, only |
| the color buffer is moved--ancillary buffers continue to be bound to |
| the pbuffer. |
| |
| This extension is written such that adding depth textures should |
| be very easy. |
| |
| 18. What happens when a color buffer is bound to a shared texture object? |
| |
| Since the color buffer is associated with the texture object itself, |
| it should be shared. |
| |
| 19. Should we specify how this extension interacts with SGIS_generate_mipmap? |
| |
| No, since this is a potential ARB extension and SGIS_generate_mipmap |
| is not. If SGIS_generate_mipmap is supported along with this extension, |
| then if wglBindTexImageARB is called and both GENERATE_MIPMAP_SGIS and |
| WGL_MIPMAP_TEXTURE_ARB are TRUE, then a set of mipmaps should be |
| generated. This behaviour needs to be documented in the |
| SGIS_generate_mipmap (or equivalent) extension. |
| |
| 20. Should we support borders on render textures? |
| |
| No. Although borders are part of 1.2.1, they are often not supported |
| and better techniques (such as virtual textures) are starting to |
| become available for paging in large textures. |
| |
| 21. Should wglBindTexImageARB take an attribute indicating whether |
| mipmaps are defined or should this be implied from the |
| WGL_MIPMAP_TEXTURE_ARB attribute of the pbuffer? |
| |
| This should be implied from the WGL_MIPMAP_TEXTURE_ARB attribute |
| since GL allows controls for the applications to use only level zero |
| image even if the pbuffer has been defined large enough to |
| store mipmaps. |
| |
| 22. This extension introduces pbuffer attributes that can be modified. |
| (Previously all pbuffer attributes were static and could not be |
| changed.) Should we allow the non-static attributes to be set when the |
| pbuffer is created or should we require the application to call |
| wglSetPbufferAttribARB? |
| |
| We require the application to call wglSetPbufferAttribARB to set |
| non-static Pbuffer attributes since this seems to be more consistent |
| with OpenGL specification. |
| |
| 23. Do we need WGL_TEXTURE_FORMAT_ARB or is WGL_ALPHA_BITS_ARB enough |
| to distinguish between selecting RGB vs. RGBA textures? Additionally, |
| how is this parameter defined for non texture buffers. |
| |
| Resolved: In order to accommodate RGBA visuals to support RGB textures |
| (i.e. ignore alpha) and to allow the specification to be extensible |
| for depth textures, WGL_TEXTURE_FORMAT_ARB is required in this |
| specification. This parameter is defined as WGL_NO_TEXTURE_ARB for |
| non texture buffers. |
| |
| 24. Should luminance and Intensity texture formats be allowed? |
| |
| No. WGL doesn't support single-channel framebuffer formats. Allowing |
| these formats would require a copy to reformat a RGB/RGBA framebuffer |
| to a Luminance or Intensity format. If luminance framebuffer gets |
| added to WGL, then this feature can be added at that time. |
| |
| Implementation Notes |
| |
| 1. In order to prevent releases of a pbuffer from the texture object |
| and to deal with implicit release followed by an explicit release, |
| the GL implementation can keep a reference to any texture pbuffer |
| in the texture object. When the pbuffer is released, this handle |
| is set to NULL. Subsequent requests for releasing the texture |
| pbuffer are ignored. |
| |
| 2. The implicit release of the color buffers has been specifed to |
| work just like the explicit release so that the implementation |
| can delete a texture object (one of the implicit free cases) without |
| having to track whether the texture was associated with any color buffers. |
| |
| Intended Usage |
| |
| To define a cube map texture, single threaded case |
| |
| 1) Create the rendering window. Call wglChoosePixelFormatARB and |
| find a suitable pixel format for rendering the image. Set the pixel |
| format for the rendering window to this pixel format. |
| |
| 2) Create the pbuffer. Call wglChoosePixelFormatARB and find a |
| suitable pixel format for rendering the texture. |
| WGL_DRAW_TO_PBUFFER and WGL_BIND_TO_TEXTURE_RGB_ARB or |
| WGL_BIND_TO_TEXTURE_RGBA_ARB must be TRUE. Create the pbuffer |
| with this pixel format. Set the pbuffer width and height to the |
| width and height of the level zero image. Set WGL_TEXTURE_FORMAT_ARB |
| to be WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB. Also set |
| WGL_TEXTURE_TARGET_ARB to WGL_TEXTURE_CUBE_MAP_ARB. |
| |
| 3) Create a context for the pbuffer. Make the context current to the |
| pbuffer and initialize the context's attributes. |
| |
| 4) Render all the cube map faces to the pbuffer. Call |
| wglSetPbufferAttribARB to set the cube map face before rendering |
| each face. Call glFlush. |
| |
| 5) Create a context for the window. Make the context current to the |
| window and intialize the contexts attributes. Bind a texture object |
| to the TEXTURE_CUBE_MAP_ARB target and set the texture parameters |
| to the desired values. |
| |
| 6) Call wglBindTexImageARB to bind the pbuffer drawable to the cube |
| map texture. Set <iBuffer> to WGL_FRONT or WGL_BACK depending upon |
| which color buffer was used for rendering the cube map. |
| |
| 7) Render to the window using the cube map texture. |
| |
| 8) Call wglReleaseTexImageARB to release the color buffer of the |
| pbuffer. Goto step 4 to generate more frames. |
| |
| To define a 2D texture, single threaded case |
| |
| In step 2, set the WGL_TEXTURE_TARGET_ARB to WGL_TEXTURE_2D_ARB. |
| |
| Since a 2D texture does not have multiple faces, in step 5 |
| there is no need to call wglSetPbufferAttribARB. |
| |
| In addition, if mipmaps are to be generated, the step 5 should |
| be repeated multiple times with calls to wglSetPbufferAttribARB |
| to set different mip levels. |
| |
| New Procedures and Functions |
| |
| BOOL wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) |
| |
| BOOL wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) |
| |
| BOOL wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, |
| const int *piAttribList) |
| |
| New Tokens |
| |
| Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB, |
| wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList> |
| parameters of wglChoosePixelFormatARB: |
| |
| WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 |
| WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 |
| |
| Accepted by the <piAttribList> parameter of wglCreatePbufferARB and |
| by the <iAttribute> parameter of wglQueryPbufferARB: |
| |
| WGL_TEXTURE_FORMAT_ARB 0x2072 |
| WGL_TEXTURE_TARGET_ARB 0x2073 |
| WGL_MIPMAP_TEXTURE_ARB 0x2074 |
| |
| Accepted as a value in the <piAttribList> parameter of |
| wglCreatePbufferARB and returned in the value parameter of |
| wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_FORMAT_ARB: |
| |
| WGL_TEXTURE_RGB_ARB 0x2075 |
| WGL_TEXTURE_RGBA_ARB 0x2076 |
| WGL_NO_TEXTURE_ARB 0x2077 |
| |
| Accepted as a value in the <piAttribList> parameter of |
| wglCreatePbufferARB and returned in the value parameter of |
| wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_TARGET_ARB: |
| |
| WGL_TEXTURE_CUBE_MAP_ARB 0x2078 |
| WGL_TEXTURE_1D_ARB 0x2079 |
| WGL_TEXTURE_2D_ARB 0x207A |
| WGL_NO_TEXTURE_ARB 0x2077 |
| |
| Accepted by the <piAttribList> parameter of wglSetPbufferAttribARB and |
| by the <iAttribute> parameter of wglQueryPbufferARB: |
| |
| WGL_MIPMAP_LEVEL_ARB 0x207B |
| WGL_CUBE_MAP_FACE_ARB 0x207C |
| |
| Accepted as a value in the <piAttribList> parameter of |
| wglSetPbufferAttribARB and returned in the value parameter of |
| wglQueryPbufferARB when <iAttribute> is WGL_CUBE_MAP_FACE_ARB: |
| |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 |
| |
| Accepted by the <iBuffer> parameter of wglBindTexImageARB and |
| wglReleaseTexImageARB: |
| |
| WGL_FRONT_LEFT_ARB 0x2083 |
| WGL_FRONT_RIGHT_ARB 0x2084 |
| WGL_BACK_LEFT_ARB 0x2085 |
| WGL_BACK_RIGHT_ARB 0x2086 |
| WGL_AUX0_ARB 0x2087 |
| WGL_AUX1_ARB 0x2088 |
| WGL_AUX2_ARB 0x2089 |
| WGL_AUX3_ARB 0x208A |
| WGL_AUX4_ARB 0x208B |
| WGL_AUX5_ARB 0x208C |
| WGL_AUX6_ARB 0x208D |
| WGL_AUX7_ARB 0x208E |
| WGL_AUX8_ARB 0x208F |
| WGL_AUX9_ARB 0x2090 |
| |
| 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 |
| |
| Add to the description of <piAttributes> in wglGetPixelFormatAttribivARB |
| and <pfAttributes> in wglGetPixelFormatfv: |
| |
| WGL_BIND_TO_TEXTURE_RGB_ARB |
| WGL_BIND_TO_TEXTURE_RGBA_ARB |
| |
| True if the color buffers can be bound to a RGB/RGBA texture. |
| Currently only pbuffers can be bound as textures so this attribute |
| will only be TRUE if WGL_DRAW_TO_PBUFFER is also TRUE. It is |
| possible to bind a RGBA visual to a RGB texture in |
| which case the values in the alpha component of the visual |
| are ignored when the color buffer is used as a RGB texture. |
| |
| Implementations may choose not to support WGL_BIND_TO_TEXTURE_RGB_ARB |
| for RGBA visuals. |
| |
| Add new table entries to match criteria in description of |
| wglChoosePixelFormatARB: |
| |
| Attribute Type Match Criteria |
| |
| WGL_BIND_TO_TEXTURE_RGB_ARB boolean exact |
| WGL_BIND_TO_TEXTURE_RGBA_ARB boolean exact |
| |
| Modify wglCreatePbufferARB: |
| |
| HPBUFFERARB wglCreatePbufferARB (HDC hDC, int iPixelFormat, |
| int iWidth, int iHeight, const int *piAttribList); |
| |
| ... |
| |
| <iWidth> and <iHeight> specify the pixel width and height of the |
| rectangular pbuffer. If the texture format is set to |
| WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB using |
| WGL_TEXTURE_FORMAT_ARB, then the pbuffer width and height |
| specify the size of the level zero texture image or, in the |
| case of a cube map texture, each level zero image. |
| |
| <piAttribList> is a list of attribute {type, value} pairs containing |
| integer attribute values. All of the attributes in <piAttribList> |
| are followed by the corresponding required value. The list is |
| terminated with a value of 0. |
| |
| <piAttribList> may be NULL or empty in which case all attributes assume |
| their default values as described below. |
| |
| The following attributes are supported by wglCreatePbufferARB: |
| |
| WGL_TEXTURE_FORMAT_ARB |
| |
| This attribute indicates the format of the texture that will be |
| created when a pbuffer is bound to a texture map. |
| It can be set to WGL_TEXTURE_RGB_ARB, WGL_TEXTURE_RGBA_ARB or |
| WGL_NO_TEXTURE_ARB. The default value is WGL_NO_TEXTURE_ARB. |
| |
| WGL_TEXTURE_TARGET_ARB |
| |
| This attribute indicates the target for the texture that will be |
| created when the pbuffer is created with a texture format of |
| WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB. This attribute can |
| be set to WGL_NO_TEXTURE_ARB, WGL_TEXTURE_1D_ARB, WGL_TEXTURE_2D_ARB |
| or WGL_TEXTURE_CUBE_MAP_ARB. The default value is WGL_NO_TEXTURE_ARB. |
| |
| WGL_MIPMAP_TEXTURE_ARB |
| |
| If this attribute is set to a non-zero value, and the texture format |
| is set to WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB, then storage |
| for mipmaps will be allocated. The default value is FALSE. |
| |
| WGL_PBUFFER_LARGEST_ARB |
| |
| If this attribute is set to a non-zero value, the largest |
| available pbuffer is allocated when the allocation of the pbuffer |
| would otherwise fail due to insufficient resources. The width or |
| height of the allocated pbuffer never exceeds <iWidth> and <iHeight>, |
| respectively. Also, if the pbuffer will be used as a texture |
| (i.e., the value of the WGL_TEXTURE_TARGET_ARB attribute is |
| WGL_TEXTURE_1D_ARB, WGL_TEXTURE_2D_ARB or WGL_TEXTURE_CUBE_MAP_ARB |
| and texture format is WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB), |
| then the aspect ratio will be preserved and the new width and |
| height will be valid sizes for the corresponding texture target. |
| (e.g. Both the width and height will be a power of 2 if the |
| implementation only supports power of 2 textures. Similarily, |
| the width and height will be equal for a cube map texture). |
| Use wglQueryPbufferARB to retrieve the dimensions of the |
| allocated pbuffer. The default value for this attribute is FALSE. |
| |
| The resulting pbuffer will contain color buffers and ancillary |
| buffers as specified by <iPixelFormat>. Note that pbuffers use |
| framebuffer resources so applications should consider deallocating |
| them when they are not in use. |
| |
| It is possible to create a pbuffer with back buffers and to swap the |
| front and back buffers by calling wglSwapLayerBuffers. The |
| contents of the back buffers after the swap depends on the |
| <iPixelFormat>. (Pbuffers are the same as windows in this respect.) |
| |
| 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). |
| |
| When wglCreatePbufferARB fails to create a pbuffer, NULL is returned. |
| To get extended error information, call GetLastError. Possible |
| errors are as follows: |
| |
| ERROR_INVALID_PIXEL_FORMAT Pixel format is not valid. |
| |
| ERROR_NO_SYSTEM_RESOURCES Insufficient resources exist. |
| |
| ERROR_INVALID_DATA <iWidth> or <iHeight> is negative or zero. |
| |
| ERROR_INVALID_DATA WGL_TEXTURE_TARGET_ARB attribute is |
| set to WGL_TEXTURE_CUBE_MAP_ARB, and |
| iWidth does not equal iHeight. |
| |
| ERROR_INVALID_DATA WGL_TEXTURE_TARGET_ARB attribute is set |
| to WGL_TEXTURE_1D_ARB, and iHeight is |
| not set to one. |
| |
| ERROR_INVALID_DATA The pixel format attribute |
| WGL_TEXTURE_FORMAT_ARB is |
| WGL_TEXTURE_RGB_ARB or WGL_TEXTURE_RGBA_ARB |
| and WGL_PBUFFER_WIDTH and/or |
| WGL_PBUFFER_HEIGHT specify an invalid |
| size for the implementation (e.g., the |
| texture size is not a power of 2). |
| |
| ERROR_INVALID_DATA An attribute in <piAttribList> is not a |
| valid attribute. |
| |
| ERROR_INVALID_DATA The texture format is set to |
| WGL_NO_TEXTURE_ARB and texture target |
| is set to something other than |
| WGL_NO_TEXTURE_ARB. |
| |
| ERROR_INVALID_DATA The texture format is set to some target |
| besides WGL_NO_TEXTURE_ARB and texture |
| target is set to 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 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. |
| |
| .... |
| |
| Add wglSetPbufferAttribARB: |
| |
| To set an attribute of a pbuffer call |
| |
| BOOL wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, |
| const int *piAttribList); |
| |
| with <hPbuffer> set to a previously returned pbuffer handle. |
| <piAttribList> is a list of attribute {type, value} pairs containing |
| integer values. All the attributes in <piAttribList> are followed by |
| the corresponding desired value. The list is terminated with 0. |
| If <piAttribList> is NULL or empty then this function is a no-op. |
| |
| The following values are accepted: |
| |
| WGL_MIPMAP_LEVEL_ARB |
| |
| For mipmap textures, this attribute indicates which level of the |
| mipmap should be rendered. The default value is zero. If the value |
| of this attribute is outside the range of supported mipmap level, |
| the closest valid mipmap level is selected for rendering. |
| |
| WGL_CUBE_MAP_FACE_ARB |
| |
| For cube map textures, this attribute indicates which face of the |
| cube map should be rendered; it must be set to one of |
| |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, |
| WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB. |
| |
| The default value is WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB. |
| |
| If wglSetPbufferAttribARB fails, FALSE is returned. To get extended |
| error information, call GetLastError. Possible errors are as follows: |
| |
| ERROR_INVALID_HANDLE <hPbuffer> is not a valid handle. |
| |
| ERROR_INVALID_DATA Bad attribute specified in <piAttribList>. |
| |
| ERROR_INVALID_DATA WGL_MIPMAP_LEVEL_ARB does not specify |
| a valid mipmap level. |
| |
| ERROR_INVALID_DATA WGL_CUBE_MAP_IMAGE_ARB is not set to a |
| valid value. |
| |
| .... |
| |
| Modify wglQueryPbufferARB: |
| |
| To query an attribute associated with a specific pbuffer, call |
| |
| BOOL wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, |
| int *piValue); |
| |
| with <hPbuffer> set to a previously returned pbuffer handle. |
| <iAttribute> must be set to one of WGL_PBUFFER_WIDTH_ARB, |
| WGL_PBUFFER_HEIGHT_ARB, WGL_PBUFFER_LOST_ARB, WGL_TEXTURE_TARGET_ARB, |
| WGL_MIPMAP_TEXTURE_ARB, WGL_MIPMAP_LEVEL_ARB, WGL_CUBE_MAP_FACE_ARB |
| or WGL_TEXTURE_FORMAT_ARB. |
| |
| The WGL_PBUFFER_LOST_ARB query can be used to determine if the pixel |
| buffer memory was lost due to a display mode change. A value of |
| TRUE is returned in buffer <piValue> if the display mode change lost |
| the memory for the pixel buffer. It is not an error to render to a |
| pixel buffer in this state, but the effect of rendering to it is the |
| same as if the pixel buffer was destroyed: the context state will |
| be updated, but the values of the returned pixels are undefined. |
| The pixel buffer must be destroyed and recreated if the pixel buffer |
| memory has been lost. A value of FALSE is returned to indicate |
| that the contents of the pixel buffer are unaffected by the display |
| mode change. |
| |
| When a color buffer of a pbuffer is bound as a texture, then the |
| contents of that texture must be preserved until the color buffer is |
| released. If the pbuffer is lost, any color buffers that are bound |
| to textures will be freed when they are released back to the pbuffer |
| by calling wglReleaseTexImage. |
| |
| If wglPbufferAttribARB fails, FALSE is returned. To get extended |
| error information, call GetLastError. Possible errors are as follows: |
| |
| ERROR_INVALID_HANDLE <hPbuffer> is not a valid handle. |
| |
| ERROR_INVALID_DATA <iAttribute> is not a valid attribute. |
| |
| .... |
| |
| Add wglBindTexImageARB and wglReleaseTexImageARB: |
| |
| The command |
| |
| BOOL wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) |
| |
| defines a one-dimensional texture image or two-dimensional |
| texture image or a set of two-dimensional cube map texture images. |
| The texture image or images consist of the image data in <iBuffer> |
| for the specified pbuffer, <hPbuffer>, and need not be copied. |
| The texture target, the texture format and the size of the |
| texture components are derived from attributes of pbuffer |
| specified by <hPbuffer>. |
| |
| Note that any existing images associated with the different |
| mipmap levels of the texture object are freed (it is as if |
| TexImage was called with an image of zero width). |
| |
| The pbuffer attribute WGL_TEXTURE_FORMAT_ARB determines the base |
| internal format of the texture. The component sizes are also |
| determined by pbuffer attributes as shown in the table below. |
| |
| Texture Component Size |
| |
| R WGL_RED_BITS_ARB |
| G WGL_GREEN_BITS_ARB |
| B WGL_BLUE_BITS_ARB |
| A WGL_ALPHA_BITS_ARB |
| |
| |
| Table x.x: Size of texture components |
| |
| The texture targets are derived from the WGL_TEXTURE_TARGET_ARB |
| attribute of <hPbuffer>. If the texture target for the pbuffer is |
| WGL_TEXTURE_CUBE_MAP_ARB then <iBuffer> defines a set of cubemap |
| images for the cube map texture objects which are bound to the |
| current context (hereafter referred to as the current texture |
| object). Note that when the texture target is |
| WGL_TEXTURE_CUBE_MAP_ARB, all cube map texture targets are defined |
| by a single call to wglBindTexImageARB. If the texture target is |
| WGL_TEXTURE_2D_ARB, then <iBuffer> defines a 2D texture for the |
| current 2D texture object; if the texture target is WGL_TEXTURE_1D_ARB, |
| then <iBuffer> defines a 1D texture for the current 1D texture object. |
| |
| The possible values for <iBuffer> are WGL_FRONT_LEFT_ARB, |
| WGL_FRONT_RIGHT_ARB, WGL_BACK_LEFT_ARB, WGL_BACK_RIGHT_ARB, and |
| WGL_AUX0_ARB through WGL_AUXn_ARB. |
| |
| If <hPbuffer> is the calling thread's current drawable, |
| wglBindTexImageARB performs an implicit glFlush. |
| |
| After this function is called, the pbuffer associated with <iBuffer> |
| is no longer available for reading or writing. Any read |
| operation, such as glReadPixels, which reads values from any of the |
| pbuffer's color buffers or ancillary buffers, will produce |
| indeterminate results. In addition, any draw operation that is |
| done to the pbuffer prior to wglReleaseTexImageARB being called, |
| produces indeterminant results. Specifically, if the pbuffer is |
| current to a context and thread then rendering commands will be |
| processed and the context state will be updated but the pbuffer may |
| or may not be written. Also, SwapBuffers is a no-op if it is called |
| on this pbuffer. |
| |
| Note that the color buffer is bound to a texture object. If the |
| texture object is shared between contexts, then the |
| color buffer is 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 buffer bound to it. However, these calls |
| will cause the color buffer to be released back to the pbuffer and |
| new memory will be allocated for the texture. Note that the color |
| buffer is released even if the image that is being defined is a |
| mipmap level that was not defined by the color buffer. |
| |
| wglBindTexImageARB is ignored if there is no current rendering |
| context. |
| |
| If wglBindTexImageARB fails, FALSE is returned. To get extended |
| error information, call GetLastError. Possible errors are as follows: |
| |
| ERROR_INVALID_HANDLE <hPbuffer> is not a valid handle. |
| |
| ERROR_INVALID_DATA <iBuffer> is not a valid value. |
| |
| ERROR_INVALID_OPERATION The pbuffer attribute |
| WGL_TEXTURE_FORMAT_ARB is set to |
| WGL_NO_TEXTURE_ARB. |
| |
| ERROR_INVALID_OPERATION <iBuffer> is already bound to the texture |
| |
| |
| To release a color buffer that is being used as a texture call |
| |
| BOOL wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) |
| |
| This releases the specified color buffer back to the pbuffer. The |
| pbuffer is made available for reading and writing when it no |
| longer has any color 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, or WGL_AUX0_ARB through |
| WGL_AUXn_ARB. |
| |
| The contents of the color buffer 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 |
| buffers is unaffected by this call. Also, the contents of the depth, |
| stencil and accumulation buffers are not affected by |
| wglBindTexImageARB and wglReleaseTexImageARB. |
| |
| If the specified color 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 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). |
| |
| If wglReleaseTexImageARB fails, FALSE is returned. To get extended |
| error information, call GetLastError. Possible errors are as follows: |
| |
| ERROR_INVALID_HANDLE <hPbuffer> is not a valid handle. |
| |
| ERROR_INVALID_DATA <iBuffer> is not a valid value. |
| |
| ERROR_INVALID_OPERATION The pbuffer attribute |
| WGL_TEXTURE_FORMAT_ARB is set to |
| WGL_NO_TEXTURE_ARB. |
| |
| New State |
| |
| None |
| |
| Dependencies on GL_ARB_texture_cube_map |
| |
| If GL_ARB_texture_cube_map is not supported then all references to |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, |
| WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, |
| WGL_TEXTURE_CUBE_MAP_ARB and WGL_CUBE_MAP_FACE_ARB are deleted. |
| |
| Revision History |
| 07/16/01 bpoddar 1. Added WGL_TEXTURE_CUBE_MAP_POSITIVE_*_ARB |
| enums to the new tokens section. |
| 2. Added clarification on MIPMAP_LEVEL_ARB usage. |
| 3. Removed 1 invalid error condition from |
| wglBindTexImage. |
| 4. Changed parameter references to <parameter>. |
| |
| 07/12/01 bpoddar Fixed minor typos and added enum values. |
| |
| 06/22/01 bpoddar Minor language edits from ARB participants. |
| |
| 04/09/01 bpoddar 1. Renamed WGL_TEXTURE_TYPE_ARB to |
| WGL_TEXTURE_TARGET_ARB. |
| 2. Cleaned up behavior of WGL_TEXTURE_FORMAT_ARB. |
| |
| 03/23/01 bpoddar 1. Updated the implementation notes section |
| with the discussion at the ARB. |
| 2. Replaced ERROR_??? with specified errors |
| 3. Clarified width and height selection rules |
| for WGL_PBUFFER_LARGEST. |
| 4. Added policy for dealing with mip levels |
| both on Bind and Release. |
| 5. Specified behavior for implicit release and |
| added comment to implementation section. |
| 6. Added couple of errors to SetPbufferAttrib. |
| |
| 03/06/01 bpoddar 1. Deleted references to 3D texture |
| 2. Deleted references to LUMINANCE, INTENSITY |
| textures. |
| 3. wglBindTexImageARB no longer provides a |
| separate mipmap attribute (issue #21). |
| 4. Removed references to multiple texture |
| objects for cube maps. |
| 5. Added issue # 23. |
| 6. Added implementation notes section. |
| |
| 12/01/00 pwomack Updated issues list. Require non-static pbuffer |
| attributes to be set via SetPbufferAttrib (they |
| cannot be set when the pbuffer is created.) |
| The WGL_TEXTURE_TARGET_ARB attribute now takes |
| WGL_NO_TEXTURE_ARB as a value, so the app can |
| indicate that the pbuffer will never be bound |
| as a texture. If a pbuffer is created with |
| WGL_TEXTURE_TARGET_ARB set to WGL_NO_TEXTURE_ARB, |
| then an error results if an attempt is made to |
| bind it as a texture. Specified default values |
| for all attribute lists. When a color buffer is |
| bound as a texture then drawing to the pbuffer |
| gives undefined results (previously the |
| rendering was lost). When a color buffer is |
| bound as a texture, calling TexImage or |
| CopyTexImage releases the color buffer back to |
| the pbuffer. |
| |
| 11/12/00 pwomack Created. Copied from GLX extension. Added WGL |
| calls and removed all GLX-centric stuff. |