用于纹理上传的OpenGL PBO,不能理解一件事
好的,我在这里阅读了有关PBO的所有信息:http://www.opengl.org/wiki/Pixel_Buffer_Object和http://www.songho.ca/opengl/gl_pbo.html,但我仍然有一个问题,不知道我是否会从我的案例中获得PBO的任何好处:
我正在做视频流,目前我有一个函数将我的数据缓冲区复制到3种不同的纹理,然后我在片段着色器中做一些数学运算,然后显示纹理。
我认为PBO可以增加CPU - > GPU的上传时间,但是在这里,假设我们从上面的第二个链接获取了这个示例。
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[nextIndex]);
// map the buffer object into client's memory
// Note that glMapBufferARB() causes sync issue.
// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
// for GPU to finish its job. To avoid waiting (stall), you can call
// first glBufferDataARB() with NULL pointer before glMapBufferARB().
// If you do that, the previous data in PBO will be discarded and
// glMapBufferARB() returns a new allocated pointer immediately
// even if GPU is still working with the previous data.
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DATA_SIZE, 0, GL_STREAM_DRAW_ARB);
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if(ptr)
{
// update data directly on the mapped buffer
updatePixels(ptr, DATA_SIZE);
glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
}
// measure the time modifying the mapped buffer
t1.stop();
updateTime = t1.getElapsedTimeInMilliSec();
///////////////////////////////////////////////////
// it is good idea to release PBOs with ID 0 after use.
// Once bound with 0, all pixel operations behave normal ways.
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
那么,无论updatePixels
函数的行为updatePixels
,它仍然使用CPU周期将数据复制到映射的缓冲区中不是吗?
所以我们假设我想以这种方式使用PBO,也就是在函数中将我的帧像素更新为PBO,然后在display
函数中调用glTexSubImage2D(应该立即返回)...我会看到任何性能提升? 我不明白为什么它会更快......好吧,在glTex *调用期间我们不再等待,但我们正在等待将该帧上传到PBO的功能,对不对?
请问有人能为我清楚吗?
谢谢
关于缓冲区对象的一点是,它们可以异步使用。 你可以映射一个BO,然后让程序的其他部分更新它(认为线程,认为异步IO),同时你可以继续发布OpenGL命令。 具有三重缓冲的PBO的典型使用场景可能如下所示:
wait_for_video_frame_load_complete(buffer[k-2])
glUnmapBuffer buffer[k-2]
glTexSubImage2D from buffer[k-2]
buffer[k] = glMapBuffer
start_load_next_video_frame(buffer[k]);
draw_texture
SwapBuffers
这可以让你的程序做有用的工作,甚至上传数据到OpenGL,同时它也用于渲染
链接地址: http://www.djcxy.com/p/45733.html上一篇: OpenGL PBO for texture upload, can't understand one thing