在OpenGL中调整整个场景的亮度/伽玛

时间:2020-03-06 14:46:47  来源:igfitidea点击:

有谁知道我如何在OpenGL中实现以下效果:

  • 更改渲染场景的亮度
  • 或者在OpenGL中实现Gamma设置

我尝试通过更改光源的环境参数和光源类型(定向和全向)来进行尝试,但是结果并不均匀。 TIA。

感谢帮助,一些其他信息:
*我不能使用任何Windows特定API。
*灰度系数设置不应影响整个窗口,因为对于不同的视图,我必须具有不同的灰度系数。

解决方案

http://www.gamedev.net/community/forums/topic.asp?topic_id=435400可能是问题的答案,否则我们可以将gamma校正实现为像素着色器

在win32上,我们可以使用SetDeviceGammaRamp调整整体亮度/伽玛。但是,这会影响整个显示,因此除非应用为全屏模式,否则这不是一个好主意。

便携式的替代方法是将整个场景绘制得更亮或者更暗(这很麻烦),或者在整个场景上拍一个全屏的alpha混合四边形以根据需要将其变亮或者变暗。这两种方法都不会影响伽玛曲线,只会影响整体亮度。要调整伽玛,我们需要将整个场景抓取为纹理,然后通过像素着色器将其渲染回屏幕,该像素着色器通过伽玛函数运行每个纹理像素。

好了,阅读了更新的问题后,我们需要的是一个四边形,其混合设置可以使它下面的所有内容变暗或者变亮。例如。

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();