2

当使用函数分配纹理时glTexImage*,我知道我需要设置glTexParameteri(GL_TEXTURE_MAX_LEVEL)一个合理的值并指定所有级别直到该值,如此处所述

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

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

4

2 回答 2

2

OK, I think I got that:

The parameter levels of glTexStorage is indeed stored in the texture object, but as GL_TEXTURE_IMMUTABLE_LEVELS, not as GL_TEXTURE_MAX_LEVEL, as I thought.

The parameter GL_TEXTURE_MAX_LEVEL hence remains at the default large value. (It's possible to change it manually: the immutable flag of texture object only relates to the texture buffer and its format, but not buffer data or parameters).

The texture immutability should affect LOD calculation in the following way according to the spec:

if TEXTURE_IMMUTABLE_FORMAT is TRUE, then levelbase is clamped to the range [0; levelimmut - 1]

So leaving GL_TEXTURE_MAX_LEVEL intact (= 1000) for an immutable texture shall have the same effect as setting it to levels-1.

Verdict: driver bug; the driver apparently omits this clamping step.

于 2012-12-13T12:47:27.210 回答
1

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

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

尽管如此,我注意到我无法对以这种方式定义的不可变纹理进行采样 - 直到我调用 glGenerateMipmap 或将 GL_TEXTURE_MAX_LEVEL 指定为级别 1。

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

编辑改写澄清

于 2012-12-13T12:09:34.407 回答