opengl - 有什么方法可以在 hlsl/glsl 片段着色器中通过图元获得片段(像素)的百分比覆盖率?

标签 opengl shader rendering directx hlsl

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

最佳答案

渲染到多采样帧缓冲区时,可以查看 gl_SampleMaskIn[]片段着色器中的位掩码数组,用于检测当前片段将覆盖多少个样本。这与您将要获得的差不多,并且它不是您想要的。
显然,它具有与像素内的样本位置具有相同粒度的限制。但完整掩码也可能少于帧缓冲区中的样本数。如果渲染器决定在多样本光栅化期间为每个像素生成多个片段,则任何此类片段的样本掩码将仅用于该特定片段将写入的样本。
因此,如果您有一个 16 个样本的多样本帧缓冲区,则实现可能会为每个像素生成 4 个片段,每个片段覆盖一组不同的 4 个样本。因此,片段的示例位掩码永远不会超过 4 位,即使您要求 16 倍多采样渲染。并且基本上没有什么可以检测到这种情况是否发生(除了在特定硬件上进行测试之外)。所有这些都是实现定义的。
基本上,您想要的并不是真正可用的; gl_SampleMask是你能得到的最接近的,它的有用程度将非常依赖于实现。

关于opengl - 有什么方法可以在 hlsl/glsl 片段着色器中通过图元获得片段(像素)的百分比覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66073247/

相关文章:

opengl - 如何渲染到 OpenGL 立方体贴图纹理的一个面

python - Pyglet 将文本绘制到纹理中

rendering - 理解来自顶点着色器的片段着色器输入

java - Libgdx 中的简单 OpenGL ES 着色器输出是白色应该是红色

java - 如何旋转由旋转的各个部分聚合而成的形状?

opengl - bool 纹理

java - LWJGL 加速渲染

python - ModernGL 设置统一

opengl - 人们为什么在OpenGL的距离函数上使用sqrt(dot(distanceVector,distanceVector))?

three.js - 如何用三个js将多个纹理剪辑为多边形