将SSAO与全球灯光和本地灯光相结合

时间:2016-06-03 21:26:57

标签: opengl glsl shader deferred-rendering ssao

我最近在我的引擎中实现了SSAO(延迟着色),但我对如何将SSAO与全局光和局部光(点光源)结合起来非常不安全。

我应该这样做:

//Global light pass.
vec3 sceneColor = DiffuseBRDF + SpecularBRDF;
float luminance = dot(sceneColor, vec3(0.2126, 0.7152, 0.0722));
sceneColor *= mix(texture(ssaoTexture, texCoord).r, 1.0, luminance);

//Local light pass.
//Use additive blending in this pass, i.e. glBlendFunc(GL_ONE, GL_ONE).
//The final result would be:
vec3 finalColor = sceneColor + pointLight0 + pointLight1 + ... + pointLightN;

或者这个:

//Global light pass.
vec3 sceneColor = DiffuseBRDF + SpecularBRDF;

//Local light pass.
//Use additive blending in this pass, i.e. glBlendFunc(GL_ONE, GL_ONE).
vec3 finalColor = sceneColor + pointLight0 + pointLight1 + ... + pointLightN;

//Composite pass.
float luminance = dot(finalColor, vec3(0.2126, 0.7152, 0.0722));
finalColor *= mix(texture(ssaoTexture, texCoord).r, 1.0, luminance);

1 个答案:

答案 0 :(得分:3)

环境光遮挡是一个值,用于描述环境光可以击中表面上的点的程度。环境光是来自各个方向的光,而不是来自单个光源,并且通常包含天空照明,基于图像的照明,全局照明或简单的平面颜色。应用AO的正确方法是将其与环境光照相乘。简单地说,环境遮挡是环境光照,因为阴影是直接照明。

因此,如果您的点光源是“大气”灯并且应该表示没有镜面高光的柔和环境光,那么您应该仅将AO应用于这些点光源,而不进行任何亮度缩放。如果点光源是具有明确定义光源的灯光并且您没有任何明显的环境光线,那么您应该保持一致并将AO均匀地应用于所有光源,并使用亮度缩放来模拟正确AO应用产生的外观。 / p>