实现环境映射和IBL以延迟着色

时间:2014-09-05 10:54:49

标签: opengl

我们的延迟渲染器达到了我们需要应用环境贴图的程度。 IBL将质量提升到更高水平(正如您所看到的那样,立方体贴图显然不见了): Missing cubemaps

在对这个话题进行了几个小时的研究之后,我仍然找不到让我感到高兴的解决方案。

这是我到目前为止所发现的

  1. 将结果的附加正向传递添加到LA缓冲区。这看起来像个坏主意,我们使用延迟着色来避免多次传递,然后再次渲染所有内容以进行立方体贴图和IBL。但至少我们可以使用现有的GBuffer-Data(包括深度)来渲染对象,并且可以在CPU上轻松完成所用立方体贴图的选择。
  2. 渲染全屏平面并在着色器中执行一些疯狂选择正确的立方体贴图(在着色器中对CPU执行的操作)。这似乎比再渲染一切更糟糕,glsl着色器将变得非常庞大。即使我实现了tile-deferred-rendering(尚未完成),它似乎也是一个坏主意。
  3. 将立方体贴图信息直接存储到第一遍的GBuffer中也不适用于我的渲染器。我已经使用了3个缓冲区的所有组件(3个与ES 3.0保持兼容),并且已经对颜色值(YCoCg)和法线(Spheremap变换)使用了压缩。
  4. 最后但并非最不重要的是非常简单且不太好的解决方案:使用单个立方体贴图并将其应用于孔场景。这不是一个真正的选择,因为这将对质量产生巨大影响。
  5. 我想知道环境立方体贴图是否存在另一种方法。如果不是他们最好的方法。到目前为止,我个人最喜欢的是第二个,即使这需要再次渲染整个场景(至少在仅支持4个渲染的设备上)。

1 个答案:

答案 0 :(得分:1)

在测试了不同的东西后,我发现最好的想法是使用第二种解决方案,但实施起来很困难。最好的方法是使用计算着色器,但是现在大多数移动设备都不支持这些着色器。

因此,您需要在移动设备上使用单个立方体贴图,或者在第一个渲染过程中将数据放入缓冲区。如果这是不可能的,你需要渲染它平铺每个图块的一些平截头体剔除(以减少每个像素的操作次数)。