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

Bar*_*icz 13 opengl opengl-es glsl shadow

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

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

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

Nic*_*las 14

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

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

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

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

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

  • 该死的,这很复杂。非常感谢您的回答,第三次阅读后我开始明白了:) (2认同)