当光栅化器调用基元时,它会将其拆分为片段(像素)集合。接下来,片段着色器调用每个获得的像素。有什么方法可以让我在片段着色器中有额外的浮点参数,它将存储有关源基元覆盖多少确切像素的信息?这应该在三角形边框像素上具有 0-1 的非平凡值。显然,它在每个“内部”三角形像素上都是 1。
我想要光栅化器为我计算并传递这个值。
我认为“保守光栅化”可以帮助解决这个问题,但据我所知,它用于稍微不同的任务(主要用于碰撞检测)。
另外,据我所知,没有内置方法可以做到这一点。也许我可以改变光栅化的性质来做到这一点?是否可以?
最佳答案
渲染到多采样帧缓冲区时,可以查看 gl_SampleMaskIn[]
片段着色器中的位掩码数组,用于检测当前片段将覆盖多少个样本。这与您将要获得的差不多,并且它不是您想要的。
显然,它具有与像素内的样本位置具有相同粒度的限制。但完整掩码也可能少于帧缓冲区中的样本数。如果渲染器决定在多样本光栅化期间为每个像素生成多个片段,则任何此类片段的样本掩码将仅用于该特定片段将写入的样本。
因此,如果您有一个 16 个样本的多样本帧缓冲区,则实现可能会为每个像素生成 4 个片段,每个片段覆盖一组不同的 4 个样本。因此,片段的示例位掩码永远不会超过 4 位,即使您要求 16 倍多采样渲染。并且基本上没有什么可以检测到这种情况是否发生(除了在特定硬件上进行测试之外)。所有这些都是实现定义的。
基本上,您想要的并不是真正可用的; gl_SampleMask
是你能得到的最接近的,它的有用程度将非常依赖于实现。
关于opengl - 有什么方法可以在 hlsl/glsl 片段着色器中通过图元获得片段(像素)的百分比覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66073247/