GPU等待纹理

时间:2013-06-13 10:15:13

标签: ios opengl-es opengl-es-2.0

我正在使用着色器来处理和渲染视频帧。所以我需要在每次绘制调用之前更新纹理。一切正常,但当我运行 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 不支持它们。

我在这里缺少什么?

1 个答案:

答案 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(…);
}

我认为现在很清楚会发生什么。