glGetInternalformat返回值是否均依赖target与internalformat参数?
glGetInternalformat参数依赖分析(基于OpenGL 4.6规范22.3节)
不是所有可查询的pname都同时依赖target和internalformat参数,存在返回值仅依赖单一参数、甚至不依赖两者的pname,以下是具体分类:
一、返回值与target无关的pname
这类pname的结果仅由internalformat决定,只要传入的target与该内部格式兼容,返回结果一致:
GL_NUM_SAMPLE_COUNTS:返回该内部格式支持的多重采样数量的个数GL_SAMPLE_COUNTS:返回该内部格式支持的具体多重采样数量列表GL_COLOR_COMPONENTS:返回颜色分量的数量GL_DEPTH_COMPONENTS:返回深度分量的数量GL_STENCIL_COMPONENTS:返回模板分量的数量GL_RED_BITS、GL_GREEN_BITS、GL_BLUE_BITS、GL_ALPHA_BITS、GL_DEPTH_BITS、GL_STENCIL_BITS:对应分量的存储位数GL_INTERNALFORMAT_PREFERRED:返回实现推荐的等效内部格式GL_INTERNALFORMAT_TYPE:返回内部格式对应的数据类型(如GL_FLOAT、GL_UNSIGNED_BYTE)GL_FRAMEBUFFER_RENDERABLE:标记该内部格式是否可用于帧缓冲渲染GL_FRAMEBUFFER_BLENDABLE:标记该内部格式是否支持混合操作GL_TEXTURE_COMPRESSION:标记该内部格式是否为压缩纹理格式GL_TEXTURE_COMPRESSED_BLOCK_WIDTH、GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT、GL_TEXTURE_COMPRESSED_BLOCK_SIZE:压缩格式的块尺寸与字节大小
二、返回值与internalformat无关的pname
这类pname数量极少,主要针对target的通用属性,规范中定义其返回值不随internalformat变化:
GL_MAX_SAMPLES:返回当前target支持的最大多重采样数(需确保target支持多重采样)
三、同时依赖target和internalformat的pname
大多数pname属于此类,结果会同时受两个参数影响:
GL_TEXTURE_WIDTH、GL_TEXTURE_HEIGHT:针对纹理类target,返回该内部格式支持的最大纹理尺寸(不同纹理类型如GL_TEXTURE_2D和GL_TEXTURE_3D返回值不同)GL_RENDERBUFFER_WIDTH、GL_RENDERBUFFER_HEIGHT:针对渲染缓冲target,返回该内部格式支持的最大渲染缓冲尺寸GL_TEXTURE_LOD_BIAS:返回该target+internalformat组合支持的LOD偏移范围GL_TEXTURE_COMPARE_MODE:返回该组合支持的纹理比较模式
封装简化建议
对于与target无关的pname,可以封装一个简化函数,固定传入一个通用兼容的target(比如GL_TEXTURE_2D,只要该target与目标internalformat兼容即可),无需调用者指定;对于与internalformat无关的pname,固定传入一个通用内部格式(如GL_RGBA8)即可。注意必须保证所选的target和internalformat组合合法,否则会返回错误或无效值。
内容的提问来源于stack exchange,提问作者Dwarfley
相关产品推荐
相关产品推荐

