使用OpenGL的MSAA。
我只是使用'glutSolidSphere'绘制了一个白色球体,并填充了黑色,其中'dot(Normal,CameraVec)<剪影的门槛
我在内白圈的轮廓上发现了一个奇怪的结果。看起来MSAA没有用。
顺便说一下,它在黑色圆圈的轮廓(最外面)上运行良好。
如果我增加样本数量,即使在内部白色圆圈的轮廓上也能正常工作 我认为它应该可以很好地独立于样本数量,因为在片段着色器之后会解析样本。
这是正确的结果吗?如果是,为什么?
以下是4个样本(左)和32个样本(右)的结果。
答案 0 :(得分:2)
MSAA仅有助于平滑多边形边和交叉点。它无法平滑着色器代码创建的锐利过渡。
MSAA背后的主要思想是片段着色器每个片段只执行一次。每个片段具有多个样本,并且覆盖由样本确定。这意味着片段的一些样本可以在渲染的多边形内部,一些在外部。然后,片段着色器输出仅写入覆盖的样本。但是片段中所有被覆盖的样本都具有相同的值。
深度缓冲区也具有每个样本的分辨率,这意味着多边形之间的交叉点也可以从MSAA生成的平滑中获益。
一旦你意识到MSAA是如何工作的,那么它对于多边形内部的急剧转换没有任何作用,这可能是着色器中应用逻辑的结果。要在这种情况下实现平滑,您必须评估每个样本的片段着色器,这在MSAA中不会发生。
MSAA很有吸引力,因为它确实为许多用例执行了足够的抗锯齿,而且开销相对较小。但正如你所注意到的,对于所有情况来说,这显然是不够的。
你能做些什么超出了答案的范围。主要有两个方向:
我有点困惑的是你在内部边缘用32x MSAA进行了一些平滑处理。我不认为这是预料之中的。我想知道在下采样期间是否会发生某种情况会产生某种形式的平滑。