Настройте яркость/гамму всей сцены в OpenGL.
Вопрос
Кто-нибудь знает, как я могу добиться следующего эффекта в OpenGL:
- Изменение яркости визуализированной сцены
- Или реализация настройки гаммы в OpenGL.
Я пробовал менять параметры освещения и тип света (направленный и всенаправленный), но результат не был однородным.ТИА.
Спасибо за помощь, дополнительная информация:* Я не могу использовать какой-либо API-интерфейс Windows.* Настройка гаммы не должна влиять на все окно, поскольку для разных представлений должна быть разная гамма.
Решение
В Win32 вы можете использовать SetDeviceGammaRamp для настройки общей яркости/гаммы.Однако это влияет на весь дисплей, поэтому это не очень хорошая идея, если ваше приложение не полноэкранное.
Портативная альтернатива — либо сделать всю сцену ярче или тусклее (что доставляет хлопот), либо наложить полноэкранный четырехэкранный режим с альфа-смешением на всю сцену, чтобы осветлить или затемнить ее по желанию.Ни один из этих подходов не может повлиять на гамма-кривую, а только на общую яркость;чтобы настроить гамму, вам нужно захватить всю сцену в текстуру, а затем визуализировать ее обратно на экран с помощью пиксельного шейдера, который пропускает каждый тексел через гамма-функцию.
Хорошо, прочитав обновленный вопрос, вам нужен четырехугольник с настройкой смешивания, чтобы затемнить или осветлить все, что находится под ним.Например.
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();
Другие советы
http://www.gamedev.net/community/forums/topic.asp?topic_id=435400 может быть ответом на ваш вопрос, в противном случае вы, вероятно, могли бы реализовать гамма-коррекцию в виде пиксельного шейдера.