微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有什么方法可以在 hlsl/glsl 片段着色器中按原语获得片段像素的百分比覆盖率?

如何解决有什么方法可以在 hlsl/glsl 片段着色器中按原语获得片段像素的百分比覆盖率?

当光栅化器调用图元时,它会将其拆分为片段(像素)集合。接下来,片段着色器调用每个获得的像素。有什么方法可以让我在片段着色器中有额外的浮点参数,它将存储有关源基元覆盖多少确切像素的信息?这应该在三角形边框像素上具有 0-1 的非平凡值。显然,它在每个“内部”三角形像素上都是 1。 我想要光栅化器为我计算并传递这个值。 我认为“保守光栅化”可以帮助解决这个问题,但据我所知,它用于稍微不同的任务(主要用于碰撞检测)。

此外,据我所知,没有内置方法可以做到这一点。也许我可以改变光栅化的性质来做到这一点?可能吗?

解决方法

渲染到多采样帧缓冲区时,您可以查看片段着色器中的 gl_SampleMaskIn[] 位掩码数组,以检测当前片段将覆盖多少个样本。这与您将要获得的差不多,但这并不符合您的要求。

显然,它具有与像素内的样本位置具有相同粒度的限制。但完整掩码也可能少于帧缓冲区中的样本数。如果渲染器决定在多样本光栅化期间为每个像素生成多个片段,则任何此类片段的样本掩码将仅用于该特定片段将写入的样本。

因此,如果您有一个包含 16 个样本的多样本帧缓冲区,则该实现可能会为每个像素生成 4 个片段,每个片段覆盖一组不同的 4 个样本。因此,片段的示例位掩码永远不会超过 4 位,即使您要求 16 倍多采样渲染。并且基本上没有什么可以检测到这种情况是否发生(除了在特定硬件上进行测试之外)。所有这些都是实现定义的。

基本上,你想要的并不是真正可用的; gl_SampleMask 是您所能得到的最接近的值,它的有用程度取决于实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。