不可变纹理是否需要GL_texture_MAX_LEVEL



使用glTexImage*函数分配纹理时,我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)设置为一个合理的值,并指定该值之前的所有级别,如下所述。

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

我没有找到任何官方理由说明为什么它是必要的,我希望不可变纹理的参数是不可变的(并且初始化良好)。有人能确认这种行为是否(以及为什么)正确吗?或者可能是AMD驱动程序错误?

好吧,我想我得到了:

glTexStorage的参数levels确实存储在纹理对象中,但作为GL_TEXTURE_IMMUTABLE_LEVELS,而不是像我想的那样作为GL_TEXTURE_MAX_LEVEL

因此,参数CCD_ 11保持在默认的大值(可以手动更改:纹理对象的不可变标志只与纹理缓冲区及其格式有关,而与缓冲区数据或参数无关)

根据规范,纹理不变性应以以下方式影响LOD计算:

如果TEXTURE_IMUTABLE_FORMAT为TRUE,则级别基础被箝位至范围[0;水平immut-1]

因此,对于不可变的纹理,保持GL_TEXTURE_MAX_LEVEL不变(=1000)与将其设置为levels-1具有相同的效果。

结论:驱动程序错误;驱动器显然省略了这个夹紧步骤。

我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)设置为一个合理的值,并指定达到该值的所有级别,如下所述。

好吧,你不必这么做。GL_TEXTURE_MAX_LEVEL的默认值是1000,因此比你合理使用的任何图像金字塔都大。

不过,我注意到我无法对以这种方式定义的不可变纹理进行采样,直到我调用glGenerateMipmap或将GL_texture_MAX_LEVEL指定为levels-1。

是的,这是因为图像存储独立于图像采样。GL_TEXTURE_MAX_LEVEL的值是一个影响采样时图像访问的参数(您也可以将其设置为采样器对象),它与实际纹理图像存储无关。如果您只想选择渲染过程中使用的图像的子范围,或者只想将图像上传到分配的图像金字塔的子集,您也可以在图像规范之后更改使用的图像金字塔级别的范围。

EDIT重新编写以进行澄清

相关内容

  • 没有找到相关文章

最新更新