我正在使用着色器来处理和渲染视频帧。所以我需要在每次绘制调用之前更新纹理。一切正常,但当我运行 OpenGL profiler 时,它向我显示了这个警告:
您的应用程序尝试更新为当前的纹理 用于渲染。这会导致CPU等待GPU完成 渲染。解决此问题的一种方法是使用双重或环形 缓冲方法,以便您的应用程序不更新纹理 用作绘图调用的一部分。另一种可能性是 以允许GPU完成使用的方式重新排序操作 更新之前的纹理。
我发现了article。如果我理解正确,建议使用第二个纹理作为附加缓冲区,并与第一个纹理交替使用。所以我更新了我的代码:
//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 不支持它们。
我在这里缺少什么?
答案 0 :(得分:0)
我在这里缺少什么?
OpenGL是一个异步API。调用可能比执行实际渲染更早地返回。我们来看看这个简化的绘图循环:
for(i=0; ; i++) {
glBindTexture(…, tex[i % 2]);
glTexSubImage2D(…);
glBindTexture(…, tex[(i + 1) % 2]);
draw_image();
}
现在重点是,循环迭代后i递增,这意味着我们可以将此代码重写为
glBindTexture(…, tex[0]);
glTexSubImage2D(…);
for(i=1; ; i++) {
glBindTexture(…, tex[i % 2]);
draw_image();
glTexSubImage2D(…);
}
我认为现在很清楚会发生什么。