4

我用参数 level = 0 调用 glTexImage2D。然后我调用 glGenerateMipmap(GL_TEXTURE_2D)。GL_TEXTURE_BASE_LEVEL 和 GL_TEXTURE_MAX_LEVEL 会发生什么?我假设它们是这样自动设置的:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmapsCount - 1);

稍后我可以手动设置上述参数,例如降低最大级别。那正确吗 ?

4

1 回答 1

4

正如您提到的,mipmap 堆栈的 GL_TEXTURE_BASE_LEVEL 和 GL_TEXTURE_MAX_LEVEL 值是派生的。这些值定义了所谓的纹理完整性所需的 mipmap 级别范围。当您要求 OpenGL 使用 自动生成 mipmap 时glGenerateMipmap,会填充整个堆栈。如果您使用glTextureStorage指定级别数,则 GL_TEXTURE_MAX_LEVEL 设置为比调用中提供的最大级别少一。

您可以在构建 mipmap 堆栈后修改基本和最大级别也是正确的,但是如果您让 OpenGL 构建 mipmap 堆栈,我认为它不会给您带来太多好处。如果我没记错的话,你会在加载 mipmap 时修改基本和最大级别(通过重复调用glTexImage*和递增level参数),这样你就不需要加载整个 mipmap 堆栈(你可以这样做节省纹理内存,或者可能更好地控制更高级别的采样[即,堆栈中较小的 mipmap])。您还可以使用 GL_TEXTURE_MIN_LOD 和 GL_TEXTURE_MAX_LOD 来控制在纹理中使用 mipmap 堆栈中的哪些 mipmap。这样做的原因是允许在纹理时异步加载 mipmap 级别。

于 2013-01-21T01:38:03.877 回答