Асинхронные glReadPixels с PBO

Я хочу использовать два PBO для чтения пикселей альтернативным способом. Я думал, что путь PBO будет намного быстрее, потому что glReadPixels немедленно возвращается при использовании PBO, и много времени может перекрываться.

Странно, кажется, не так много пользы. Учитывая некоторый код вроде:

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    Timer t; t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " ";

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl;

Результат

1.301 1.185
1.294 1.19
1.28 1.191
1.341 1.254
1.327 1.201
1.304 1.19
1.352 1.235

Путь PBO немного быстрее, но не удовлетворительный немедленный возврат

Мой вопрос:

  • Какой фактор влияет на производительность glReadPixels? Somethimes, стоимость этого достигает 10 мс, но 1,3 мс здесь.
  • Почему немедленный возврат стоит до 1,2 мс? Это слишком большой или просто нормально?

================================================== =========================

По сравнению с демо я обнаружил два фактора:

  • GL_BGRA лучше, чем GL_RGBA, 1,3 мс =>1,0 мс (без PBO), 1,2 мс =>0,9 мс (с pbo)
  • glutInitDisplayMode (GLUT_RGB | GLUT_ALPHA), а не GLUT_RGBA, 0,9 мс =>0,01 мс. Эту производительность я хочу. В моей системе GLUT_RGBA=GLUT_RGB=0. GLUT_ALPHA=8

Тогда еще два вопроса:

  • Почему GL_BGRA лучше, чем GL_RGBA? Это касается только конкретной платформы или всех платформ?
  • Почему GLUT_ALPHA так важен, что он сильно влияет на производительность PBO?

2 ответа

Решение

Я не знаю glutInitDisplayMode наизусть, но обычно это потому, что ваш внутренний и внешний формат не совпадают. Например, вы не заметите асинхронное поведение, когда число компонентов не совпадает, потому что это преобразование все еще блокирует glReadPixels,

Таким образом, наиболее вероятная проблема заключается в том, что с glutInitDisplay(GLUT_RGBA) вы фактически создадите кадровый буфер по умолчанию с внутренним форматом, который на самом деле RGB или даже BGR, прохождение GLUT_ALPHA параметр может сделать это RGBA или же BGRA внутренне, что соответствует количеству компонентов, которые вы хотите.

редактировать: я нашел документ nvidia, объясняющий некоторые проблемы с упаковкой пикселей и влиянием на производительность.

edit2: увеличение производительности BGRA вероятно, потому что внутренний буфер hw находится в BGRA, там на самом деле не так много всего.

BGRA - самый быстрый, так как это родной формат на современных графических процессорах. RGBA, RGB и BGR нуждаются в "переформатировании" во время чтения.

Другие вопросы по тегам