使用glTexImage*
函数分配纹理时,我知道我需要将glTexParameteri(GL_TEXTURE_MAX_LEVEL)
设置为一个合理的值,并指定该值之前的所有级别,如下所述。
我没想到这在glTexStorage*
函数的情况下也是必要的,因为它们接受层数作为参数,并为该层数预先分配内存。尽管如此,我还是注意到,在调用glGenerateMipmap
或指定GL_TEXTURE_MAX_LEVEL
到levels-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重新编写以进行澄清