Асинхронный 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? Иногда его стоимость достигает 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. НАГН _АЛЬФА=8

Затем еще два вопроса:

  • Почему GL _BGRA лучше, чем GL _RGBA? Это относится только к конкретной платформе или ко всем платформам?
  • Почему GLUT _ALPHA настолько важен, что сильно влияет на производительность PBO?
8
задан Martin Wang 10 July 2012 в 12:58
поделиться