为什么阴影贴图着色器向后工作?

时间:2018-06-25 15:55:22

标签: shader shadow-mapping

我现在正在研究阴影贴图着色器,出现的一个问题是为什么我们要先对表面(兰伯特/ phong)进行着色,然后再将阴影映射到它们上,而不是仅仅增加像素的亮度?令我感到震惊的是,光应如何工作。

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

这是我所看到的伪算法:

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

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

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

1 个答案:

答案 0 :(得分:0)

阴影映射受大小和位深度的纹理精度限制。

基于光矢量和法线的分析阴影具有很高的准确度(忽略法线贴图的主题),而且可以对同一现象的不同方面进行建模。当重叠时,它们提供了更准确的表示。 即使您剔除诸如镜面反射率之类的非扩散项,仅凭几何(深度遍历捕获的唯一数据)也无法捕获许多方面,例如微观面和小规模自阴影化。

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

因此,实际上许多“术语”确实是可加的,阴影贴图只是被相乘的一个分量,因为它提供了额外的遮挡信息。

enter image description here

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