Ajustar o brilho / gama de toda a cena em OpenGL
Pergunta
Alguém sabe como eu posso conseguir o seguinte efeito em OpenGL:
- Alterar o brilho da cena renderizada
- ou implementar uma definição Gama em OpenGL
Eu tentei alterando o parâmetro ambiente da luz e do tipo de luz (direcional e omnidirecional), mas o resultado não foi uniforme. TIA.
Obrigado por sua ajuda, algumas informações adicionais: * Eu não pode usar quaisquer janelas especificas API. * A definição de gama não deve afetar toda a janela como eu deve ter gamma diferente para diferentes pontos de vista.
Solução
No win32 você pode usar SetDeviceGammaRamp para ajustar o brilho / gama total. No entanto, isso afeta todo o visor, então não é uma boa idéia a menos que seu aplicativo é fullscreen.
A alternativa portátil, quer seja para tirar toda a cena mais brilhante ou mais escuro (que é um aborrecimento), ou tapa um quad alfa-misturado tela cheia ao longo de toda a cena a iluminar ou escurecer-lo como desejado. Nenhuma destas abordagens podem afectar a gama-curva, apenas o brilho geral; para ajustar o gamma você precisa agarrar a cena inteira em uma textura e, em seguida, torná-lo de volta para a tela através de um pixel-shader que executa cada texel através de uma função gama.
Ok, depois de ler a pergunta atualizado, o que você precisa é um quad com loteamento criado para escurecer ou tudo ilumina debaixo dela. Por exemplo.
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();
Outras dicas
http://www.gamedev.net/community/forums /topic.asp?topic_id=435400 pode ser uma resposta à sua pergunta de outra forma você provavelmente poderia implementar uma correção de gama como um pixel shader