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过程跨越两个帧。
答案 0 :(得分:0)
第二个代码段只是错误的。如果doSomeWork
没有及时完成怎么办?现在它正在访问您未映射的内存,并将导致访问冲突(或更糟)。
更好的方法是等待另一个线程的完成,并在SwapBuffers
之前的帧结束时取消映射缓冲区。