如何防止三维模型表面的锯齿状边缘?

时间:2010-04-09 21:37:34

标签: opengl graphics 3d jogl

假设我已经在openGL中实现了一个带有着色的粗糙模型查看器,它呈现了一系列块,这样我就有了这样的东西。

http://i.imgur.com/TsF7K.jpg

每当我将模型旋转到侧面时,它会在任何具有陡峭视角的表面上产生不必要的锯齿效果。

http://i.imgur.com/Bgl9o.jpg

我很确定这是由于我用来防止模型和线框之间的z-fighting的多边形偏移,但是我无法在openGL中找到阻止这种不良影响的因子/单位参数。

  1. 为防止这种情况,glPolygonOffset的因子和单位的最佳值是什么?

  2. 实施抗锯齿可以缓解这个问题吗?是表现平凡/重要的权衡?

  3. 这可能是一个阴影问题?我应该沿着这条思路尝试解决方案吗?

2 个答案:

答案 0 :(得分:3)

这看起来不像Z战斗给我..

如果要绘制平面阴影对象,然后在其上绘制一些GL_LINES,那些线条将产生该效果,因为它们不是抗锯齿的。

为什么不在对象上应用网格纹理?这样你就可以利用OpenGL的纹理过滤。您可以尝试:

  • 在此纹理上启用MIN_和MAG_过滤。
  • 使用gluBuild2DMipmaps使用mipmap创建纹理。 (见Generating Mipmaps
  • 启用各向异性过滤? (见this page

答案 1 :(得分:1)

你有可能在陡峭的角度进行z战斗(即当所有点都具有非常相似的z值时),因为
1)您的z缓冲区分辨率太低,即您设置了16位z缓冲区 - 尝试将分辨率更改为32位
2)你的模型非常小,但你的所有点太靠近了。您可以尝试扩展模型。

使用固定偏移量会产生不一致的结果,因为大多数z缓冲区方案偏向于提供更高分辨率,离近近剪辑计划越近,即距离近剪裁平面越近,偏移越小。

Here's a gamedev article更深入地讨论了这个问题

请注意,抗锯齿和更改着色器在这里不太可能有所帮助(除非你做了一些时髦的自定义像素着色器来调制z值,但这似乎对我来说太过分了,虽然我不是像素/片段着色器的专家所以它可能是可行的)