1

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

我在这里想念什么?

4

1 回答 1

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

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

于 2013-06-13T10:33:04.773 回答