更新OpenGL贴图纹理

icomxhvb  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(141)

关于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级别,我必须循环每个级别,并调用glTexSubImage2D与适当的mipmap尺寸和图像字节?如果答案是肯定的,那么我有:
第二个问题:如何检索每个mipmap维度和数据以传递到纹理中?

或者,我可以只做更新:

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

然后立即重新生成mipmaps?

glGenerateMipmap(GL_TEXTURE_2D);
edqdpe6u

edqdpe6u1#

第一个问题答案

是的

第二个问题答案

每个mipmap级别的宽度和高度正好是其上的mipmap级别的一半。因此,对于mipmap级别 n,维度是 w·2-nh·2-n,其中 wh 是级别0的大小。
它可以很容易地编程,只要回忆一下移位(类似C语言中的>><<运算符)是2的幂运算符。所以a << n` = a·2n`和a >> n= a·2-n

回答第三个问题

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

相关问题