好的,我阅读了有关PBO的所有内容:http://www.opengl.org/wiki/Pixel_Buffer_Object和http://www.songho.ca/opengl/gl_pbo.html,但我仍然有一个问题,我不知道在我的情况下使用PBO是否会有任何好处:
我正在进行视频流传输,目前我有一个函数将我的数据缓冲区复制到3个不同的纹理中,然后我在片段着色器中执行一些数学运算并显示纹理。
我认为PBO可以增加CPU->GPU的上传时间,但是在这里,让我们假设我们从上面第二个链接中获取了这个示例。
无论
那么假设我想以这样的方式使用PBO,即在函数中将我的帧像素更新到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
函数的行为如何,它仍然使用CPU周期将数据复制到映射缓冲区,对吗?那么假设我想以这样的方式使用PBO,即在函数中将我的帧像素更新到PBO中,然后在
display
函数中调用glTexSubImage2D(应立即返回)...从性能方面看,我会看到任何速度提升吗?
我不明白为什么它会更快...好吧,我们在glTex*调用期间不再等待,但是在上传帧到PBO的函数期间,我们不是正在等待吗?有人能为我澄清一下吗?
谢谢