MSAA的奇怪结果

时间:2015-11-19 17:07:20

标签: opengl msaa

使用OpenGL的MSAA。

我只是使用'glutSolidSphere'绘制了一个白色球体,并填充了黑色,其中'dot(Normal,CameraVec)<剪影的门槛 我在内白圈的轮廓上发现了一个奇怪的结果。看起来MSAA没有用。
顺便说一下,它在黑色圆圈的轮廓(最外面)上运行良好。

如果我增加样本数量,即使在内部白色圆圈的轮廓上也能正常工作 我认为它应该可以很好地独立于样本数量,因为在片段着色器之后会解析样本。

这是正确的结果吗?如果是,为什么?

以下是4个样本(左)和32个样本(右)的结果。

MSAA x4 MSAA x32

1 个答案:

答案 0 :(得分:2)

MSAA仅有助于平滑多边形边和交叉点。它无法平滑着色器代码创建的锐利过渡。

MSAA背后的主要思想是片段着色器每个片段只执行一次。每个片段具有多个样本,并且覆盖由样本确定。这意味着片段的一些样本可以在渲染的多边形内部,一些在外部。然后,片段着色器输出仅写入覆盖的样本。但是片段中所有被覆盖的样本都具有相同的值。

深度缓冲区也具有每个样本的分辨率,这意味着多边形之间的交叉点也可以从MSAA生成的平滑中获益。

一旦你意识到MSAA是如何工作的,那么它对于多边形内部的急剧转换没有任何作用,这可能是着色器中应用逻辑的结果。要在这种情况下实现平滑,您必须评估每个样本的片段着色器,这在MSAA中不会发生。

MSAA很有吸引力,因为它确实为许多用例执行了足够的抗锯齿,而且开销相对较小。但正如你所注意到的,对于所有情况来说,这显然是不够的。

你能做些什么超出了答案的范围。主要有两个方向:

  • 您可以避免在着色器代码中生成明显的过渡。如果使用标准纹理,使用mipmap可以提供帮助。对于程序转换,您可以在代码中平滑它们,可能基于渐变值。
  • 您可以使用其他抗锯齿方法。这里有太多值得一提的地方。使用超级采样很容易获得完美的抗锯齿,但它非常昂贵。大多数方法试图在获得比普通MSAA更好的结果方面达成妥协,同时不会增加太多开销。

我有点困惑的是你在内部边缘用32x MSAA进行了一些平滑处理。我不认为这是预料之中的。我想知道在下采样期间是否会发生某种情况会产生某种形式的平滑。