是否可以只上传在 OpenGL ES 2.0 中发生变化的部分纹理?

Is it possible to upload only parts of texture that has changed in OpenGL ES 2.0?

我使用 Qt 在 OpenGL 中显示 2D 纹理。大多数纹理在帧与帧之间都是相同的,但一些水平线可能已经改变。

我的第一个实现使用每帧上传整个纹理 glTexImage2D.

在我当前的实现中,我在 initializeGL() 方法中调用了 glTexStorage2D。 接下来,我仅上传使用 glTexSubImage2D 更改的水平线。我发现这要快得多。

不幸的是,我发现我需要通过远程桌面支持 运行 我的应用程序到 Windows 7 PC。在这种情况下,我需要使用 OpenGL ES 2.0 API (ANGLE).

是否可以只上传在OpenGL ES 2.0中发生变化的水平线? glTexSubImage2D 存在于 OpenGL ES 2.0 中,但没有 glTexStorage2D 它似乎不起作用。

编辑: Florian Winters 的回答很好: 我替换了

glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, m_textureWidth, m_textureHeight);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_textureWidth, m_textureHeight, 0, 
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);

在初始化中,initGL()。 对于每一帧,paintGL(),我必须添加:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, /*GL_NEAREST*/GL_LINEAR);

glBindTexture(GL_TEXTURE_2D, m_texName); 之后才能正常工作。

您需要先初始化纹理,然后才能使用 glTexSubImage2D 更新部分纹理。这可以通过调用 glTexStorage2DglTexImage2D 来完成。如果 glTexStorage2D 不可用,请使用 glTexImage2D,因为它在 OpenGL 的早期版本中就可用。

正如 glTexSubImage2Ddocumentation 所说,

GL_INVALID_OPERATION is generated if the texture array has not been defined by a previous glTexImage2D operation.