我正在使用着色器来处理和渲染视频帧。所以我需要在每次绘制调用之前更新纹理。一切正常,但是当我运行OpenGL 分析器等时,它向我显示了这个警告:
您的应用程序尝试更新到当前用于渲染的纹理。这会导致 CPU 等待 GPU 完成渲染。解决此问题的一种方法是使用双缓冲或环形缓冲方法,以便您的应用程序不会更新用作绘图调用的一部分的纹理。另一种可能性是以允许 GPU 在纹理更新之前完成使用纹理的方式重新排序操作。
我找到了这篇文章。如果我理解正确,建议使用第二个纹理作为附加缓冲区,并与第一个纹理互换使用。所以我更新了我的代码:
//use current texture
glBindTexture(GL_TEXTURE_2D, current_texture);
//update texture data
glTexImage2D(...);
//use the next texture and bind it
current_texture = (current_texture + 1)%2;
glBindTexture(GL_TEXTURE_2D, current_texture);
[and then draw smth using this texture];
工作正常,但我仍然收到来自探查器的相同警告。即使我使用 3、4 和更多额外的纹理,它也无济于事。
正如我后来发现的,这个问题可以使用解决Pixel Buffer Objects
,但似乎OpenGL ES 2.0似乎不支持它们。
我在这里想念什么?