4

我无法完全理解 OpenGL 中的纹理更新。假设我使用这样的 mipmap 创建 OpenGL 纹理:

        ///.. tex gen and bind here .... ///

        glTexStorage2D(GL_TEXTURE_2D,numMipMapLevels,GL_RGBA8,imageInfo.Width,imageInfo.Height);
        glTexSubImage2D(GL_TEXTURE_2D,0,0,0,Width,Height,GL_BGRA,GL_UNSIGNED_BYTE,data);
        glGenerateMipmap(GL_TEXTURE_2D);

现在第一个问题: 这是否意味着,当我想更新包含所有 mipmap 级别的纹理时,我是否必须遍历每个级别并使用适当的 mipmap 尺寸和图像字节调用 glTexSubImage2D?如果答案是 YES,那么我有:

第二个问题:如何检索每个 mipmap 维度和数据以传递到纹理中?

或者,我可以只做更新:

 glTexSubImage2D(GL_TEXTURE_2D,0,0,0,Width,Height,GL_BGRA,GL_UNSIGNED_BYTE,data);

然后立即重新生成mipmap?

    glGenerateMipmap(GL_TEXTURE_2D);
4

1 回答 1

3

回答第一个问题

是的

回答第二个问题

每个 mipmap 级别的宽度和高度正好是它上面的 mipmap 级别的一半。因此,对于第n级 mipmap ,维度是w·2 -nh·2 -n,其中wh是第 0 级的大小。

它可以通过回忆移位(类 C 语言中的>>and<<运算符)是 2 个运算符的力量来轻松编程。所以a << n= a·2 na >> n= a·2 -n

回答第三个问题

是的,但是特定 OpenGL 实现使用的缩小过滤器的质量可能无法满足您的需求。

于 2013-04-23T09:58:45.917 回答