对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,纹理提取成分interna