Slick2d使用动画/图像的抗锯齿

时间:2015-08-22 03:28:58

标签: java opengl antialiasing slick2d artifacts

我使用slick2d渲染动画,但使用消除锯齿

如果没有AA,那么这种运动是不稳定的,正如人们所期望的那样没有AA的东西。 我在游戏的preRenderState中打开了AA:

g.setAntiAlias(true);

这导致:

Image with graphical glitch

注意中心的对角线,可能是由于两个三角形导致矩形不能正确相交。如何在使用AA平滑运动的同时将其移除?我找到http://www.java-gaming.org/index.php?topic=27313.0,但解决方案是"删除AA"我不愿意这样做。

2 个答案:

答案 0 :(得分:1)

由于GL_POLYGON_SMOOTH,这看起来很像工件。

当您使用该(已弃用)功能时,您应该在启用混合和混合函数的情况下绘制所有不透明几何体:GL_SRC_ALPHA_SATURATE, GL_ONE。如果不这样做会在大多数轮廓上产生白色轮廓(基本上是别名边缘)。

  OpenGL红皮书的

Chapter 6声明:

     
    

现在您需要适当地混合重叠边缘。首先,关闭深度缓冲区,以便控制如何绘制重叠像素。然后将混合因子设置为GL_SRC_ALPHA_SATURATE(来源)和GL_ONE(目的地)。使用这种专门的混合功能,最终颜色是目标颜色和缩放源颜色的总和;比例因子是输入源alpha值或者减去目标alpha值的较小值。

         

这意味着对于具有较大alpha值的像素,连续的输入像素对最终颜色几乎没有影响,因为减去目标alpha的一个几乎为零。利用这种方法,多边形边缘上的像素最终可能与来自稍后绘制的另一个多边形的颜色混合。最后,您需要对场景中的所有多边形进行排序,以便在绘制之前从前向后排序。

  

当他们尝试启用GL_POLYGON_SMOOTH时,几乎没有人正确地做了很多工作。

答案 1 :(得分:0)

每次在Slick2D中启用抗锯齿功能时,它应该看起来像这样。

g.setAntiAlias(true);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA_SATURATE, GL11.GL_ONE);

与Andon的答案基本相同,但是使用可以解决问题的代码。

请注意,首先绘制的内容将位于顶部,而不是最后绘制的区域。因此,您可能需要颠倒渲染顺序。