使用glTexImage*
函数分配纹理时,我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)
设置为合理的值,并指定所有级别,直到该值为as described here。
在glTexStorage*
函数的情况下,我没想到这是必要的,因为它们接受层数作为参数并预先为这些层数分配内存。尽管如此,我注意到我无法采样这种方式定义的不可变纹理 - 直到我调用glGenerateMipmap
或指定GL_TEXTURE_MAX_LEVEL
到levels-1
。
我没有找到任何官方原因,为什么它应该是必要的,我期望不可变纹理的参数是,嗯,不可变(和良好初始化)。有人可以确认这种行为是否(以及为什么)是正确的?或者它可能是AMD驱动程序错误?
答案 0 :(得分:2)
好的,我想我明白了:
levels
的参数glTexStorage
确实存储在纹理对象中,但正如我所想的那样GL_TEXTURE_IMMUTABLE_LEVELS
,而不是GL_TEXTURE_MAX_LEVEL
。
参数GL_TEXTURE_MAX_LEVEL
因此保持默认的大值。 (可以手动更改它:纹理对象的不可变标志仅与纹理缓冲区及其格式有关,但与缓冲区数据或参数无关。)
纹理不变性应根据规范以下列方式影响LOD计算:
如果TEXTURE_IMMUTABLE_FORMAT为TRUE,则级别 base 被钳制 到范围[0; level immut - 1]
因此,保留GL_TEXTURE_MAX_LEVEL
完整(= 1000)不可变纹理应与将其设置为levels-1
具有相同的效果。
判决:驱动程序错误;司机显然忽略了这个夹紧步骤。
答案 1 :(得分:1)
我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)设置为合理的值,并指定该值之前的所有级别,如此处所述。
嗯,你不必。 GL_TEXTURE_MAX_LEVEL的默认值为1000,因此比您合理使用的任何图像金字塔都要大。
但是,我注意到我无法采样这样定义的不可变纹理 - 直到我调用glGenerateMipmap或指定GL_TEXTURE_MAX_LEVEL为level-1。
是的,那是因为图像存储与图像采样无关。 GL_TEXTURE_MAX_LEVEL的值是一个影响采样时图像访问的参数(您可以将其设置为采样器对象),它独立于实际的纹理图像存储。如果您只想选择渲染过程中使用的图像的子范围,或者只将图像上传到分配的图像金字塔的子集中,您也可以在图像规范之后更改使用的图像金字塔等级的范围。< / p>
编辑改编为澄清