对OGL程序员,纹理的大小是非常重要的,OGL纹理资源一般都是有限的。OGL提供了一种特殊的纹理目标称为代理纹理(Texture Proxy),用于判断当前的OGL实现在某种特定的纹理大小下是否支持某种特定的纹理格式。纹理代理存在一个主要的限制:纹理代理回答的问题是一个指定格式的纹理大小是否能够被加载到纹理内存中。并不能回答是否有足够的能力处理所请求的纹理,比如不能确定这个纹理系统是否有足够的资源让其成为常驻纹理。
简单的判断当前OGL实现支持的纹理大小
GLint texMaxSize;
// intel OGL3.1大小为8192 pixel,AMD OGL4.2 为16342 pixel
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texMaxSize);
GLint texMax3DSize;
// intel OGL3.1 为2048 pixel,AMD OGL4.2 为8192 pixel
glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &texMax3DSize);
GLint texMaxCubeSize;
// intel OGL3.1大小为8192 pixel,AMD OGL4.2 为16342 pixel
glGetIntegerv(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_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_RECTANGLE,GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_1D_ARRAY, GL_PROXY_TEXTURE_2D_ARRAY,GL_PROXY_TEXTURE_RECTANGLE, GL_PROXY_TEXTURE_2D_MULTISAMPLE, GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_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_WIDTH, GL_TEXTURE_HEIGHT, GL_TEXTURE_DEPTH, GL_TEXTURE_INTERNAL_FORMAT,GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE, GL_TEXTURE_DEPTH_SIZE, GL_TEXTURE_COMPRESSED,GL_TEXTURE_COMPRESSED_IMAGE_SIZE,
and GL_TEXTURE_BUFFER_OFFSET are accepted.
params
Returns the requested data.
实例:
GLint width;
// 不成功参数会返回0
glGetTexLevelParameteriv(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);
本文介绍了如何利用OpenGL的纹理代理技术来判断当前实现支持的纹理大小和格式。通过创建纹理代理并查询纹理状态变量,可以确定指定大小和格式是否被支持。

1631

被折叠的 条评论
为什么被折叠?



