我现在正在研究阴影贴图着色器,出现的一个问题是为什么我们要先对表面(兰伯特/ phong)进行着色,然后再将阴影映射到它们上,而不是仅仅增加像素的亮度?令我感到震惊的是,光应如何工作。
如果我们使用阴影贴图,则意味着我们创建了一个纹理,该纹理告诉我们哪些屏幕空间像素暴露于光源。那么为什么我们需要进行整个lambert \ phong计算呢?为什么不直接从组合阴影贴图获得光照?
这是我所看到的伪算法:
如果这将是具有正确光强度的图像,则结果。现在,我们将强度纹理乘以反照率纹理得到最终图像。据我所知,一次只需要3个纹理,这是不是过多的Emory?
我认为人们一定没有这样做的原因,我想我只需要有人指出原因。
答案 0 :(得分:0)
阴影映射受大小和位深度的纹理精度限制。
基于光矢量和法线的分析阴影具有很高的准确度(忽略法线贴图的主题),而且可以对同一现象的不同方面进行建模。当重叠时,它们提供了更准确的表示。 即使您剔除诸如镜面反射率之类的非扩散项,仅凭几何(深度遍历捕获的唯一数据)也无法捕获许多方面,例如微观面和小规模自阴影化。
阴影映射本身也是一种二进制操作,您需要累积许多样本(“抽头”)或以某种方式处理输出以获得半影或任何中间值。
因此,实际上许多“术语”确实是可加的,阴影贴图只是被相乘的一个分量,因为它提供了额外的遮挡信息。
这是来自Unity的原始示例,底部的图像是屏幕空间阴影缓冲区的捕获。顶部具有镜面反射项和扩散项。