不可变纹理是否需要GL_TEXTURE_MAX_LEVEL?

时间:2012-12-13 11:40:39

标签: opengl textures opengl-4

使用glTexImage*函数分配纹理时,我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)设置为合理的值,并指定所有级别,直到该值为as described here

glTexStorage*函数的情况下,我没想到这是必要的,因为它们接受层数作为参数并预先为这些层数分配内存。尽管如此,我注意到我无法采样这种方式定义的不可变纹理 - 直到我调用glGenerateMipmap或指定GL_TEXTURE_MAX_LEVELlevels-1

我没有找到任何官方原因,为什么它应该是必要的,我期望不可变纹理的参数是,嗯,不可变(和良好初始化)。有人可以确认这种行为是否(以及为什么)是正确的?或者它可能是AMD驱动程序错误?

2 个答案:

答案 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>

编辑改编为澄清