问题 什么是OpenGL中的影子采样器以及它们的可能用途?


我一直在和你一起工作 这个ES扩展 有一段时间了,但我仍然不太明白这些阴影采样器是什么以及可以用它们做什么。谷歌搜索并没有给我带来任何漂亮,可读的结果,所以我在这里发帖。

我正在寻找能帮助我真正了解这些可以做些什么的东西。这可以是现实使用案例,也可以说明这些与普通采样器有何不同。我的意思是,他们存储深度数据。但是这些数据是如何产生的?它只是由一个绑定到深度附件的纹理制成的吗?

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


4665
2018-03-06 14:46


起源

确定片段是否处于阴影中涉及从深度纹理中读取值并将其与片段在光空间中的距离进行比较。如果前者更大,则它处于阴影中,否则它会被点亮。您可以手动执行此操作,也可以使用执行获取和比较步骤的特殊采样器。影子采样器提供百分比更接近“免费”过滤的情况并不少见。也就是说,读取4个纹素而不是1,比较所有4个,并返回一个数字,描述这些测试中有多少次失败。这允许更平滑的阴影边界。 - Damon
@Damon为什么不是那个答案? :) - Bartek Banachewicz
主要是因为它不够详细,因为我对GL ES没有太多经验(问题主要是关于)。我必须首先深入了解该特定扩展的规范,以提供完全合格的答案(并确保此ES扩展与我期望的行为完全不同,如在桌面GL中)。虽然我的评论可能会给你(已经完全阅读该规范的人)足够的暗示来理解它的含义。 - Damon
@Damon这不是主要关于ES,看得更近;我问的是一个概念,而不是特别是ES版本。我也很确定DT版本可以很好地转换为ES使用 - Bartek Banachewicz


答案:


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

对于从纹理中提取的每个样本,将深度与给定值进行比较。如果比较通过,那么获取的样本实际上是1.0。如果比较失败,则为0.0。然后过滤然后处理样本  这种比较。因此,如果我正在进行线性滤波,并且一半的样本通过比较而一半不通过,则得到的值为0.5。

要做到这一点,你必须同时激活你正在使用的采样器对象/纹理对​​象的深度比较,但是你  必须在着色器中使用阴影采样器。原因是纹理访问功能现在需要采取额外的值:比较纹理访问的值。

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

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


11
2018-03-06 17:44



该死的很复杂。非常感谢您的回答,经过第三次阅读后我开始明白了:) - Bartek Banachewicz