有些事情我完全不了解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);
答案 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实施所使用的缩小过滤器的质量可能无法满足一个人的要求。