更新OpenGL纹理的mipmapped级别

4

关于OpenGL中纹理更新的问题,我有一些不太明白的地方。假设我像下面这样使用mipmaps创建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?如果答案是肯定的,那么我需要:

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

或者,我可以只做更新:

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

立刻重新生成mipmaps吗?
    glGenerateMipmap(GL_TEXTURE_2D);
1个回答

3

第一个问题的答案

是的

第二个问题的答案

每个mipmap级别的宽度和高度都恰好是上面一级mipmap级别的一半。因此,对于mipmap级别n,其尺寸为w·2-n和h·2-n,其中w和h是级别0的大小。

可以通过记住位移(在类C语言中的>><<运算符)是2的幂运算符来轻松编程。因此,a << n = a·2na >> n = a·2-n

第三个问题的答案

是的,但特定OpenGL实现使用的缩小滤镜的质量可能不符合某人的要求。


好的,每个mipmap的像素数据也应该被“修剪”或偏移吗? - Michael IV
@MichaelIV:如果你所说的“trimming”是指下采样,那么是的。但是,如果你使用mipmapping,那么下采样滤波器应该比稀疏盒子或线性采样好得多,因为你可以免费使用GL_NEAREST或GL_LINEAR。为了获得最佳的视觉质量,你应该使用Lancosz(又名sinc)滤波器从原始信号中进行下采样。 - datenwolf
@datenwolf,您有没有任何屏幕截图可以比较使用GL_LINEAR_MIPMAP_LINEAR的带或不带同步滤波器的视觉质量。我刚刚在谷歌上搜索了一下,但没有找到任何屏幕截图。 - CoffeDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接