2

出于基准测试的目的,让我们采用这个著名的 PBO 回读代码

问题:

  1. 使用 PBO 在我的 PC 中没有效果。即使使用最新的驱动程序更新和正确的像素格式 BGRA。

更新 1:我也尝试了 3 个 PBO 的相同示例。但即使那样也没有区别。

注:Intel(R) Core(TM) i5-3470S CPU @ 2.90GHz,2901 Mhz,4 Core(s),显卡:Intel(R) HD Graphics 2500

PBO: off  
Read Time: 9 ms
Process Time: 2 ms
Transfer Rate: 39.5 Mpixels/s. (45.0 FPS)

PBO: on 
Read Time: 7 ms
Process Time: 2 ms
PBO: on Transfer Rate: 38.8 Mpixels/s. (44.2 FPS)

更新 2:PBO 在外部 GPU 和 Intel i-7 系列中正常工作。

PC配置:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz, 3400 Mhz, 4 Core(s), 8 Logical Processor(s), Video Card: Geforce 210. 所以它原来是问题集成 GPU 和外部 GPU。我相信这对于许多想知道为什么他们的代码不起作用的人来说将是一个有用的提示!

PBO: on 
PBO: on Read Time: 0.06 ms
Process Time: 2 ms
Transfer Rate: 112.4 Mpixels/s. (127.9 FPS)

PBO: off 
Read Time: 4 ms
Process Time: 2 ms
Transfer Rate: 93.3 Mpixels/s. (106.1 FPS)
4

1 回答 1

1

链接中:

映射 PBO ...

请注意,如果 GPU 仍在使用缓冲区对象,则 glMapBufferARB() 将不会返回,直到 GPU 完成其与相应缓冲区对象的工作。为避免这种停顿(等待),请在 glMapBufferARB() 之前使用 NULL 指针调用 glBufferDataARB()。然后,OpenGL 会丢弃旧的缓冲区,并为缓冲区对象分配新的内存空间。

您可能需要将上面建议的更改应用于以下代码:

// "index" is used to read pixels from framebuffer to a PBO
// "nextIndex" is used to update pixels in the other PBO
index = (index + 1) % 2;
nextIndex = (index + 1) % 2;

// set the target framebuffer to read
glReadBuffer(GL_FRONT);

// read pixels from framebuffer to PBO
// glReadPixels() should return immediately.
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboIds[index]);
glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);

// map the PBO to process its data by CPU
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboIds[nextIndex]);
glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, 0, NULL, GL_STATIC_DRAW_ARB);
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
                                        GL_READ_ONLY_ARB);
if(ptr)
{
    processPixels(ptr, ...);
    glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
}

// back to conventional pixel operation
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
于 2015-02-05T07:51:18.570 回答