我在OpenGL中使用片段着色器来进行(其中包括)伽马校正,目的是线性化我的输入纹理数据与我最终在屏幕上看到的内容之间的关系。但根据我目前的理解,这与alpha混合不兼容:两个半透明纹理可以线性混合在一起,但据我所知,这只能在片段着色器完成后发生他们的事情,因此在我的情况下伽马校正之后。这打破了整个系统的线性。
为了说明,假设我们在某个像素位置有两个纹理重叠:纹理1更靠近具有颜色vec4( c1, alpha )
的相机,纹理2在其后面具有不透明颜色c2
。同一个着色器在两个纹理上运行并将屏幕伽玛函数的反转应用于每个纹理,因此我认为渲染的是:
alpha * inverse_gamma(c1) + (1-alpha) * inverse_gamma(c2)
而我真正想要的是:
inverse_gamma( alpha * c1 + (1 - alpha) * c2 )
我想我希望存在的是某种“场景着色器”在整个帧缓冲区组成之后运行,我可以移动inverse_gamma()
的实现。但我没有找到任何像这样的概念的参考。有没有办法做到这一点?
(我分别针对OpenGL 2.1 / GLSL 1.2以及OpenGL 3.3 + / GLSL 3.3+,所以我意识到这两种设置可能有两种不同的答案。)