15

我一直在使用这个 ES 扩展,但我仍然不太了解这些阴影采样器是什么以及可以将它们用于什么。谷歌搜索并没有真正让我得到任何好的、可读的结果,所以我在这里发帖。

我正在寻找可以帮助我真正了解这些功能的东西。这可以是现实生活中的用例,也可以是仅仅显示这些与普通采样器有何不同的东西。我的意思是,好的,它们存储深度数据。但是这些数据是如何产生的呢?它只是由绑定到深度附件的纹理制成吗?

此外,我的问题适用于 DT(桌面)GL 和 ES,也可能适用于 WebGL;我并不真正关心确切的调用或枚举,因为它们很容易在规范中找到。

4

1 回答 1

18

阴影采样器”是用于深度比较纹理的采样器。通常,如果您访问深度纹理,则会在该纹理坐标处获得(过滤的)深度值。但是,使用深度比较模式,您所做的是不同的操作。

对于从纹理中提取的每个样本,您将深度与给定值进行比较。如果比较通过,则提取的样本实际上是 1.0。如果比较失败,则为 0.0。然后在比较之后对样本进行过滤。所以如果我在做线性过滤,一半的样本通过比较,一半没有,我得到的值为 0.5。

为此,您必须在正在使用的采样器对象/纹理对​​象上激活深度比较,但您必须在着色器中使用阴影采样器。原因是纹理访问函数现在需要一个额外的值:用于比较纹理访问的值。

这主要用于阴影贴图,因此得名。阴影贴图存储从灯光到最近表面的深度。因此,您将其与从灯光到正在渲染的表面的深度进行比较。如果要渲染的表面比阴影贴图中的表面更接近灯光,那么您会从阴影采样器中获得 1.0。如果表面离光源较远,则为 0.0。在任何一种情况下,您都将值乘以灯光颜色,然后照常对该灯光进行所有照明计算。

在采样之前进行比较的原因是所谓的“百分比更接近过滤”。在深度值之间进行过滤不会产生合理的结果;这不是你想要的。您想先进行比较,然后过滤比较的布尔结果。然后你得到的是深度纹理中有多少样本通过了比较的测量。这会在阴影边缘提供更好的效果。

于 2013-03-06T17:44:07.043 回答