OpenGL 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 функция, она все еще использует циклы процессора для копирования данных в отображенный буфер, не так ли?

Допустим, я хотел использовать PBO таким образом, чтобы обновить пиксели моего кадра в PBO в функции, а затем в display функция для вызова glTexSubImage2D (которая должна немедленно вернуться) … Могу ли я увидеть какое-либо ускорение в плане производительности?
Я не понимаю, почему это было бы быстрее … хорошо, мы больше не ждем во время вызова glTex *, но мы ждем во время функции, которая загружает кадр в PBO, не так ли?

Может кто-нибудь объяснить это мне, пожалуйста?

Спасибо

3

Решение

Дело в том, что объекты-буферы заключаются в том, что их можно использовать асинхронно. Вы можете отобразить BO, а затем сделать так, чтобы какая-то другая часть программы обновляла его (думайте о потоках, думайте об асинхронном вводе-выводе), в то время как вы можете продолжать вводить команды 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, в то время как она также используется для рендеринга.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]