2012-07-10 10 views
8

Voglio utilizzare due PBO per leggere pixel in modo alternativo. Ho pensato che il modo PBO sarebbe molto più veloce, perché glReadPixels ritorna immediatamente quando si usa PBO e si può sovrapporre un sacco di tempo.glinceadPixels asincroni con PBO

Stranamente non sembra esserci molto beneficio. Considerando un certo codice come:

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; 

Il risultato è

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 

Il modo in PBO è un po 'più veloce, ma non una soddisfacente immediato ritorno

La mia domanda è:.

  • Qual è il fattore che influisce sulle prestazioni di glReadPixels? A volte, il costo di esso raggiunge 10 ms, ma 1,3 ms qui.
  • Perché immediato-ritorno costa fino a 1,2 ms? È troppo grande o solo normale?

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

Secondo confronto con una demo, ho trovato due fattori:

  • GL_BGRA è meglio di GL_RGBA, 1.3ms => 1,0 ms (senza PBO), 1.2ms => 0.9ms (con PBO)
  • glutInitDisplayMode (GLUT_RGB | GLUT_ALPHA) piuttosto che GLUT_RGBA, 0.9ms => 0.01ms .Questa è la prestazione che voglio. Nel mio sistema, GLUT_RGBA = GLUT_RGB = 0. GLUT_ALPHA = 8

poi un altro due domande:

  • Perché GL_BGRA è meglio di GL_RGBA? È il caso di una piattaforma specifica o di tutte le piattaforme?
  • Perché GLUT_ALPHA è così importante da influire enormemente sulle prestazioni del PBO?
+0

ooo appena testato questo me stesso sul mio sistema GLUT_RGBA 330 fps GLUT_RGB | 630fps GLUT_ALPHA che è un aumento di un fattore 2 era sfuggito che GLUT_ALPHA era importante. – ColacX

risposta

5

Non so glutInitDisplayMode a memoria, ma questo in genere è dovuto al fatto che il formato interno ed esterno non corrispondono. Ad esempio, non si noterà il comportamento asincrono quando il numero di componenti non corrisponde perché questa conversione blocca ancora lo glReadPixels.

Quindi il problema più probabile è che con glutInitDisplay(GLUT_RGBA) si sarà effettivamente creare un framebuffer di default con un formato interno che in realtà è RGB o addirittura BGR. il passaggio del parametro GLUT_ALPHA probabilmente lo renderà RGBA o BGRA internamente, che corrisponde al numero di componenti che si desidera.

modifica: Ho trovato uno nvidia document che spiega alcuni problemi relativi all'imballaggio dei pixel e all'influenza delle prestazioni.

edit2: il guadagno di prestazioni di BGRA è probabile perché il buffer hw interno è in BGRA, non c'è molto altro.

2

BGRA è il più veloce poiché questo è il formato nativo delle moderne GPU. RGBA, RGB e BGR richiedono la "riformattazione" durante la lettura.