关于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);
1条答案
按热度按时间edqdpe6u1#
第一个问题答案
是的
第二个问题答案
每个mipmap级别的宽度和高度正好是其上的mipmap级别的一半。因此,对于mipmap级别 n,维度是 w·2-n 和 h·2-n,其中 w 和 h 是级别0的大小。
它可以很容易地编程,只要回忆一下移位(类似C语言中的
>>
和<<
运算符)是2的幂运算符。所以a << n` = a·2n`和
a >> n= a·2-n
回答第三个问题
是的,但是特定OpenGL实现所使用的缩小过滤器的质量可能无法满足人们的需求。