我正在阅读文档ARB_shadow,他们暗示 OpenGL 可以在纹理采样器中自由实现 PCF(百分比更接近过滤),但他们不能在规范中谈论它。
首先他们说:
- 双线性或三线性滤波是如何实现的?
解决方案:我们建议一种实现行为,但将细节留给实现。这里的差异相当于阴影边缘的质量和柔和度。具体的过滤算法可以通过分层扩展来表达。为了避免知识产权和专利问题,我们故意在这里含糊其辞。
然后稍后:
如果 TEXTURE_MAG_FILTER 不是 NEAREST 或 TEXTURE_MIN_FILTER 不是 NEAREST 或 NEAREST_MIPMAP_NEAREST 则可以通过将多个深度纹理值与纹理 R 坐标进行比较来计算 r。这方面的细节取决于实现,但 r 应该是 [0, 1] 范围内的值,该值与比较通过或失败的数量成正比。
而且......那是PCF!
问题
第一个问题是:它有效吗?当您使用 LINEAR 过滤器对深度纹理进行采样时,有多少供应商真正使用 PCF?
第二个(也是最重要的)问题是:如何检测通过 ARB_shadow 进行的硬件 PCF 过滤是否有效?如果它不存在,我想回退到着色器中的软件 PCF。
笔记
我注意到 ARB_shadow 与
ARB_fragment_program_shadow(至少在我可以访问的显卡上)密切相关。ARB_fragment_program_shadow 是着色器中 PCF 的低级硬件支持。这是答案的线索吗,即。如果两个扩展都存在,那么当我说魔术词时会出现硬件 PCF?用简单的二进制结果实现 ARB_shadow 将是愚蠢的。我假设在驱动程序中实现 ARB_shadow 的全部意义在于执行 PCF,即使不允许文档这么说。ARB_shadow 的存在是否意味着硬件 PCF?