Ho un sistema di rendering in cui disegno su un FBO con un renderbuffer a campionamento multiplo, quindi lo confondono con un altro FBO con una texture per risolvere i campioni in modo da leggere la texture per eseguire l'ombreggiatura post-elaborazione mentre disegno al backbuffer (indice FBO 0).Quando chiamare glEnable (GL_FRAMEBUFFER_SRGB)?
Ora mi piacerebbe ottenere un output sRGB corretto ... Il problema è il comportamento del programma è piuttosto incoerente tra quando lo eseguo su OS X e Windows e questo cambia anche a seconda della macchina: Su Windows con Intel HD 3000 non si applica la non linearità sRGB ma sull'altra mia macchina con una Nvidia GTX 670. Su Intel HD 3000 in OS X lo applicherà anche.
Quindi questo probabilmente significa che non sto impostando lo stato di abilitazione GL_FRAMEBUFFER_SRGB
nei punti corretti del programma. Tuttavia non riesco a trovare alcun tutorial che in realtà mi dica quando dovrei abilitarlo, dicono solo che è facile e non ha costi di performance.
Attualmente non sto caricando in nessuna trama, quindi non ho ancora avuto la necessità di gestire la linearizzazione dei loro colori.
Per forzare il programma a non sputare semplicemente indietro i valori di colore lineari, ciò che ho provato è semplicemente commentare la mia riga glDisable(GL_FRAMEBUFFER_SRGB)
, che in pratica significa che questa impostazione è abilitata per l'intera pipeline e in realtà la forza indietro di forza su ogni frame.
Non so se questo è corretto o meno. Certamente applica una non linearizzazione ai colori, ma non posso dire se questo viene applicato due volte (il che sarebbe male). Potrebbe applicare la gamma mentre eseguo il rendering al mio primo FBO. Potrebbe farlo quando bliterò il primo FBO al secondo FBO. Perchè no?
Sono andato al punto di prendere i colpi dello schermo del mio fotogramma finale e confrontare i valori di colore dei pixel prima per i colori li ho impostato al programma:
ho impostato il colore ingresso RGB (1, 2,3) e l'uscita è RGB (13,22,28).
Sembra quasi una compressione di colori molto bassa e mi porta a chiedermi se la gamma viene applicata più volte.
Ho appena eseguito l'equazione sRGB e posso verificare che la conversione sembra essere applicata solo una volta in quanto i valori 1/255, 2/255 e 3/255 lineari corrispondono a sRGB 13/255, 22/255 e 28/255 utilizzando l'equazione 1.055*C^(1/2.4)+0.055
. Dato che l'espansione è così grande per questi bassi valori di colore, dovrebbe essere ovvio se la trasformazione del colore sRGB viene applicata più volte.
Quindi, non ho ancora determinato quale sia la cosa giusta da fare. fa glEnable(GL_FRAMEBUFFER_SRGB)
si applica solo ai valori del framebuffer finale, nel qual caso posso semplicemente impostarlo durante la mia routine GL init e dimenticarlo qui di seguito?
Bene, ecco la cosa. Quando abilito 'GL_FRAMEBUFFER_SRGB' durante l'inizializzazione e non lo tocco per sempre, anche su Intel HD 3000 in Windows eseguirà la trasformazione corretta. È solo che sembra richiedere che sia abilitato per più del percorso del codice rispetto a Nvidia. –
Quello che hai detto ha molto senso che il formato sRGB dei buffer dovrebbe determinare se i valori sRGB sono scritti su di essi. Lo verificherò per vedere se questo è implementato correttamente, e mi consentirà sicuramente di ottenere un chilometraggio molto maggiore di 8 bit per canale. Spero che anche il passo di risoluzione dei multisample lo faccia correttamente: ho riscontrato risultati di risoluzione dei multisample errati prima, ma potrei aver funzionato nella modalità sbagliata in quel momento. (vedi questo argomento http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not-gamma-correct-with-FBOs) –
Intel mantiene il driver OpenGL per i loro processori su Apple macchine? Avevo l'impressione che Apple avesse scritto tutto da solo (il che, secondo la mia esperienza, spiegherebbe perché il loro driver AMD è così pieno di errori). – Philip