OGL纹理之纹理代理

来源:互联网 发布:电力通信网 数据分析 编辑:程序博客网 时间:2024/06/05 19:00
对OGL程序员,纹理的大小是非常重要的,OGL纹理资源一般都是有限的。OGL提供了一种特殊的纹理目标称为代理纹理(Texture Proxy),用于判断当前的OGL实现在某种特定的纹理大小下是否支持某种特定的纹理格式。纹理代理存在一个主要的限制:纹理代理回答的问题是一个指定格式的纹理大小是否能够被加载到纹理内存中。并不能回答是否有足够的能力处理所请求的纹理,比如不能确定这个纹理系统是否有足够的资源让其成为常驻纹理。

简单的判断当前OGL实现支持的纹理大小

 GLint texMaxSize;     // intel OGL3.1大小为8192 pixel,AMD OGL4.2 为16342 pixelglGetIntegerv(GL_MAX_TEXTURE_SIZE, &texMaxSize); GLint texMax3DSize; // intel OGL3.1 为2048 pixel,AMD OGL4.2 为8192 pixelglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &texMax3DSize);       GLint texMaxCubeSize;   // intel OGL3.1大小为8192 pixel,AMD OGL4.2 为16342 pixelglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &texMaxCubeSize);

判断在指定的大小和格式下,当前的OGL实现支持否

因为纹理单元字节数越大,纹理宽高就会等比变化。要求有边框的纹理和mipmap纹理会进一步减少可用内存的数量。

1.创建纹理代理

glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// 立方体纹理代理
/*glTexImage2D(GL_PROXY_TEXTURE_CUBE_MAP, 0, GL_RGBA, checkImageWidth, checkImageHeight,
0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);*/

2.用glGetTexLevelParameter*()查询纹理状态变量的值

如果OGL没有足够资源容纳这个纹理代理,表示宽度,高度,边框宽度,以及level,纹理提取成分internalformat, 纹理格式format,纹理类型type等的纹理状态都被设置为0.函数原型:glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
glGetTexLevelParameter — return texture parameter values for a specific level of detail
target
Specifies the target to which the texture is bound for glGetTexLevelParameterfv and glGetTexLevelParameteriv functions. Must be one of the following values: GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_3DGL_TEXTURE_1D_ARRAYGL_TEXTURE_2D_ARRAYGL_TEXTURE_RECTANGLE,GL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_2D_MULTISAMPLE_ARRAYGL_TEXTURE_CUBE_MAP_POSITIVE_XGL_TEXTURE_CUBE_MAP_NEGATIVE_X,GL_TEXTURE_CUBE_MAP_POSITIVE_YGL_TEXTURE_CUBE_MAP_NEGATIVE_YGL_TEXTURE_CUBE_MAP_POSITIVE_ZGL_TEXTURE_CUBE_MAP_NEGATIVE_Z,GL_PROXY_TEXTURE_1DGL_PROXY_TEXTURE_2DGL_PROXY_TEXTURE_3DGL_PROXY_TEXTURE_1D_ARRAYGL_PROXY_TEXTURE_2D_ARRAY,GL_PROXY_TEXTURE_RECTANGLEGL_PROXY_TEXTURE_2D_MULTISAMPLEGL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAYGL_PROXY_TEXTURE_CUBE_MAP, orGL_TEXTURE_BUFFER.
texture
Specifies the texture object name for glGetTextureLevelParameterfv and glGetTextureLevelParameteriv functions.
level
Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level  is the th mipmap reduction image.
pname
Specifies the symbolic name of a texture parameter. GL_TEXTURE_WIDTHGL_TEXTURE_HEIGHTGL_TEXTURE_DEPTHGL_TEXTURE_INTERNAL_FORMAT,GL_TEXTURE_RED_SIZEGL_TEXTURE_GREEN_SIZEGL_TEXTURE_BLUE_SIZEGL_TEXTURE_ALPHA_SIZEGL_TEXTURE_DEPTH_SIZEGL_TEXTURE_COMPRESSED,GL_TEXTURE_COMPRESSED_IMAGE_SIZE, and GL_TEXTURE_BUFFER_OFFSET are accepted.
params
Returns the requested data.

实例:
GLint width;// 不成功参数会返回0glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);GLint height;glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);GLint border;glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_BORDER, &border);GLint internalFormat;// 刚好是#define GL_RGBA 0x1908的十进制glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internalFormat);
0 0