Perché l'utilizzo di glReadBuffer / glReadPixels restituisce un'immagine nera su schede Intel?


8

Ho questo pezzo di codice

glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); 

Il che funziona perfettamente in tutte le GPU Nvidia e AMD che ho provato, ma fallisce in quasi tutti i singoli video integrati Intel che ho provato. In realtà funziona in un 945GME molto vecchio, ma fallisce in tutti gli altri. Invece di ottenere uno screenshot, sto effettivamente ottenendo una schermata nera.

Se aiuta, sto lavorando con il motore Doom3 e quel codice è derivato dal codice di acquisizione dello schermo incorporato. A proposito, anche con il gioco originale non riesco comunque a catturare schermate su quei dispositivi Intel. La mia ipotesi è che non stiano implementando correttamente lo standard o qualcosa del genere. C'è una soluzione per questo?


1
Puoi darci alcuni esempi specifici di chipset video integrati Intel che falliscono? Solo così siamo tutti sicuri che stiamo parlando della stessa cosa. (Il mio codice assomiglia molto al tuo, per inciso)
Trevor Powell,

Stavo usando Intel 945.965, GMA HD e nessuno dei due ha funzionato. Erano in alcuni ispiratori 1525, un altro da un Inspiron 1764. Quello che ha funzionato era un Intel 950 molto vecchio da un Acer Aspire One 110L. Sei riuscito a risolverlo?
cloudraven

3
Forse devi leggere dal buffer GL_BACK? Le manpage OpenGL indicano che è l'impostazione predefinita per la modalità a doppio buffer. Ma per riferimento, il codice sopra (con GL_FRONT o GL_BACK) ha funzionato sulla mia scheda Intel HD.
QuasarDonkey,

Ci proverò domani. È strano, non dovrebbe essere un comportamento indefinito? Bene, posso farlo accadere solo su carte Intel.
Cloudraven

Cloudraven, vorrei controllare RB_ExecuteBackEndCommands da tr_backend.cpp per i casi in cui il backbuffer potrebbe essere cancellato prima della chiamata di ReadPixels.
Jing

Risposte:


4

La grafica Intel ha sempre avuto problemi con la lettura o il disegno sul buffer anteriore. Una buona regola empirica che seguo con Intel è questa: se non puoi farlo in D3D, non provare nemmeno a farlo in OpenGL, anche se le specifiche dicono che dovresti essere in grado di farlo - e D3D no consentire l'accesso al buffer frontale in questo modo, quindi ... basta usare GL_BACK.


Sì, preferirei utilizzare GL_BACK, ma GL_FRONT. È solo che GL_BACK non funziona. Abbastanza divertente, GL_FRONT sembra funzionare, ma non l'ho testato a fondo.
cloudraven,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.