gpt4 book ai didi

c++ - 用于纹理上传的OpenGL PBO,无法理解一件事

转载 作者:太空狗 更新时间:2023-10-29 20:43:50 26 4
gpt4 key购买 nike

好的,我在这里阅读了有关 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 函数的行为如何,它仍在使用 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,同时它也用于渲染

关于c++ - 用于纹理上传的OpenGL PBO,无法理解一件事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14425092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com