1

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

1 回答 1

3

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

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

于 2016-06-03T22:06:02.373 回答