【问题标题】:Combine SSAO with global light and local lights将 SSAO 与全局光和局部光相结合
【发布时间】:2016-06-03 21:26:57
【问题描述】:

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

【问题讨论】:

  • 嗯,ssaoTexture 是什么意思?我的印象是 SSAO 发生在屏幕空间中,基于找到场景中的角落并基于此移除环境光。我不知道适合该模型的ssaoTexture 中的内容。
  • ssaoTexture 包含为当前帧计算的 SSAO。

标签: opengl glsl shader deferred-rendering ssao


【解决方案1】:

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

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

【讨论】:

  • 谢谢!现在我知道如何应用这个效果了:)
猜你喜欢
  • 2014-07-16
  • 2014-07-30
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多