将 SSAO 与全局光和局部光相结合

Combine SSAO with global light and local lights

我最近在我的引擎中实现了 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);

环境光遮挡是一个描述有多少环境光可以击中表面上的点的值。环境光是一种来自各个方向的光,而不是来自单一光源,通常包含天空照明、基于图像的照明、全局照明或简单的平面颜色。应用 AO 的正确方法是将其与环境照明相乘。简而言之,环境光遮蔽之于环境光就像阴影之于直接光一样。

因此,如果您的点光源是 "atmospheric" 光源并且应该代表没有镜面高光的柔和环境照明,那么您应该仅将 AO 应用于这些点光源,而不进行任何亮度缩放。如果点光源是具有明确光源的光源并且您没有任何明显的环境照明,那么您应该保持一致并将 AO 平等地应用于所有光源,并使用亮度缩放来模拟正确的 AO 应用程序产生的外观。