PBO не работает должным образом в интегрированном графическом процессоре

Для целей сравнения давайте возьмем этот известный Код обратной связи PBO.

Проблема:

  1. Использование PBO не имеет никакого эффекта на моем компьютере. Даже с последним обновлением драйвера & правильный пиксельный формат BGRA.

Обновление 1: я также попробовал тот же пример с 3 PBO. Но нет никакой разницы даже тогда.

ПРИМЕЧАНИЕ. Процессор Intel® Core i5-3470S с частотой 2,90 ГГц, 2901 МГц, 4 ядра (-ей),
Видеокарта: Intel® R Graphics HD 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 работает правильно во внешнем графическом процессоре & также в серии Intel i-7.

Конфигурация ПК:
Процессор Intel (R) Core (TM) i7-3770 с тактовой частотой 3,40 ГГц, 3400 МГц, 4 ядра (-ей), 8 логических процессоров, видеокарта: Geforce 210. Проблема со встроенным графическим процессором & Внешний графический процессор. Я считаю, что это будет полезный совет для многих людей, которые задаются вопросом, почему их код не работает!

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)

2

Решение

в ссылка на сайт :

Картографирование ПБО …

Обратите внимание, что если графический процессор все еще работает с буферным объектом,
glMapBufferARB () не вернется, пока GPU не завершит свою работу с
соответствующий буферный объект. Чтобы избежать этого срыва (подождите), позвоните
glBufferDataARB () с указателем NULL прямо перед glMapBufferARB ().
Затем 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);
1

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


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