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

标签 opengl opengl-es glsl shadow

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

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

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

最佳答案

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

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

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

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

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

关于opengl - 什么是 OpenGL 中的阴影采样器以及它们的可能用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250380/

相关文章:

c - 无法从 OpenGL 3.2/3.3 检索版本信息

math - 如何从旋转矩阵中删除轴?

android - 如何在 Android 中使用 OpenGl 移动形状?

xcode - cocos2d-iphone-2.1-beta2 中 CCScrollLayer 的问题

opengl - 法线贴图问题

c++ - 更快的全屏渲染(OpenGL/glsl)?

opengl - 我什么时候应该在 OpenGL 中使用 STD140?

java - 为什么我在 OpenGL (3) 中的三角形不使用 lwjgl 渲染?

java - OpenGL/着色器/矩阵 : Weird scaling of the shape after a rotation of the view matrix

android - Android 4.3 纵向模式下的全屏相机预览