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

时间:2013-03-06 14:46:56

标签: opengl opengl-es glsl shadow

我一直在使用this ES extension一段时间,但我仍然不太了解这些阴影采样器是什么以及可以使用它们的内容。谷歌搜索并没有给我带来任何漂亮,可读的结果,所以我在这里发帖。

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

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

1 个答案:

答案 0 :(得分:14)

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

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

要执行此操作,您必须同时激活正在使用的采样器对象/纹理对​​象的深度比较,但必须在着色器中使用阴影采样器。原因是纹理访问功能现在需要一个额外的值:比较纹理访问的值。

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

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