【问题标题】:Why are shadowmapping shaders working backwards?为什么阴影贴图着色器向后工作?
【发布时间】:2018-06-25 15:55:22
【问题描述】:

我目前正在研究阴影贴图着色器,出现的一个问题是,为什么我们要先对表面(lambert/phong)进行着色,然后再将阴影映射到它们上面,而不是仅仅添加地照亮像素?这让我觉得与光的工作方式相反。

如果我们使用阴影贴图,这意味着我们创建了一个纹理,告诉我们哪些屏幕空间像素暴露在光源下。那么为什么我们需要进行整个 lambert\phong 计算呢?为什么不直接通过组合阴影贴图获得光照?

这是我看到的伪算法:

  1. 默认情况下,输出图像的所有像素都是全黑的。
  2. 生成不亮的反照率屏幕纹理
  3. 为灯光生成阴影贴图
  4. 修改输出图像。我们只修改暴露在光照下的像素(匹配阴影贴图深度 +- 偏差等),根据光强度、衰减等使暴露的像素更亮。
  5. 选择下一盏灯
  6. 转到第 3 步

如果这将是具有正确光强度的图像的结果。现在我们将强度纹理乘以反照率纹理并得到最终图像。据我所知,这一次只需要 3 个纹理,是不是太多了 emory?

我认为人们没有这样做一定是有原因的,我想我只是需要有人指出原因。

【问题讨论】:

    标签: shader shadow-mapping


    【解决方案1】:

    阴影映射在大小和位深度方面都受到纹理精度的限制。

    基于光矢量和法线的分析着色具有很高的精度(忽略法线贴图的主题),而且可以模拟同一现象的不同方面。虽然重叠,但它们提供了更准确的表示。 即使去掉非漫反射项,如镜面反射,单独的几何体(深度通道捕获的唯一数据)也无法捕获许多方面,例如微面和小尺度自阴影。

    此外,阴影映射本身是一种二元运算,您需要累积许多样本(“抽头”)或以某种方式处理输出以获得半影或任何中间值。

    因此在实践中,许多“术语”确实是相加的,阴影映射只是一个相乘的组件,因为它提供了额外的遮挡信息。

    这是来自 Unity 的粗略示例,底部的图像是屏幕空间阴影缓冲区的捕获。顶部有镜面反射项和漫反射项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多