更新OpenGL mipmapped纹理

时间:2013-04-23 09:38:13

标签: opengl opengl-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);

1 个答案:

答案 0 :(得分:3)

回答第一个问题

回答第二个问题

每个mipmap级别的高度和高度都是它上方的mipmap级别的一半。因此,对于mipmap级别 n ,维度为 w·2 -n h·2 -n 其中 w h 的大小为0级。

通过调用位移(C语言中的>><<运算符)是2个运算符的幂,可以轻松编程。所以 a << n = a·2 n a >> n = a·2 -n

回答第三个问题

是的,但特定OpenGL实施所使用的缩小过滤器的质量可能无法满足一个人的要求。