glMapBuffer会占用GPU时间吗?

时间:2012-07-10 18:29:05

标签: opengl pbo

glMapBuffer的一个常见用法是

previousPBO.render();
bindNextPBO();
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
    doSomeWork(src);
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}

有2个PBO以替代方式工作。

但是,有时,doSomeWork(。)可能在另一个线程中。如果上面的代码适用, 当前线程必须等待doSomeWork()完成。另一种解决方案是:

previousPBO.render();
bindNextPBO();
if(currentPBO.mapped) {
    currentPBO.mapped = false;
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
    currentPBO.mapped = true;
    doSomeWork(src);
}

在这种情况下,同一PBO的map-> unmap过程跨越两个帧。

  • PBO的未映射状态是否会停止GPU的渲染?
  • 对表现有什么不良影响?

1 个答案:

答案 0 :(得分:0)

第二个代码段只是错误的。如果doSomeWork没有及时完成怎么办?现在它正在访问您未映射的内存,并将导致访问冲突(或更糟)。

更好的方法是等待另一个线程的完成,并在SwapBuffers之前的帧结束时取消映射缓冲区。