Modifica la luminosità / gamma dell'intera scena in OpenGL
Domanda
Qualcuno sa come posso ottenere il seguente effetto in OpenGL:
- Cambia la luminosità della scena renderizzata
- O implementando un'impostazione Gamma in OpenGL
Ho provato modificando il parametro ambientale della luce e il tipo di luce (direzionale e omnidirezionale) ma il risultato non è stato uniforme. TIA.
Grazie per l'aiuto, alcune informazioni aggiuntive: * Non riesco a utilizzare alcuna API specifica di Windows. * L'impostazione gamma non dovrebbe influire sull'intera finestra in quanto devo avere una gamma diversa per viste diverse.
Soluzione
Su win32 è possibile utilizzare SetDeviceGammaRamp per regolare la luminosità / gamma complessiva. Tuttavia, ciò influisce sull'intero display, quindi non è una buona idea a meno che l'app non sia a schermo intero.
L'alternativa portatile è quella di rendere l'intera scena più luminosa o più fioca (che è una seccatura), o di schiaffeggiare un quad alfa a schermo intero su tutta la scena per schiarire o scurire come desiderato. Nessuno di questi approcci può influenzare la curva gamma, solo la luminosità complessiva; per regolare la gamma devi catturare l'intera scena in una trama e quindi renderla di nuovo sullo schermo tramite un pixel-shader che esegue ogni texel attraverso una funzione gamma.
Ok, dopo aver letto la domanda aggiornata, quello di cui hai bisogno è un quad con il blending impostato per scurire o schiarire tutto ciò che c'è sotto. Eg.
if( brightness > 1 )
{
glBlendFunc( GL_DEST_COLOR, GL_ONE );
glColor3f( brightness-1, brightness-1, brightness-1 );
}
else
{
glBlendFunc( GL_ZERO, GL_SRC_COLOR );
glColor3f( brightness, brightness, brightness );
}
glEnable( GL_BLEND );
draw_quad();
Altri suggerimenti
http://www.gamedev.net/community/forums /topic.asp?topic_id=435400 potrebbe essere una risposta alla tua domanda, altrimenti potresti probabilmente implementare una correzione gamma come pixel shader