【问题标题】:Slick2d using anti-aliasing with Animations/ImagesSlick2d 对动画/图像使用抗锯齿
【发布时间】:2015-08-22 03:28:57
【问题描述】:

我正在使用 slick2d 渲染动画,但使用了抗锯齿

没有 AA,运动会很不稳定,正如人们对没有 AA 的预期一样。 我在游戏的 preRenderState 中打开 AA:

g.setAntiAlias(true);

这导致:

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

【问题讨论】:

  • 那些白线不是光栅化错误,如果这是你的想法,恰恰相反。如果您使用正确的混合功能,它们就会消失(有关详细信息,请参阅我的答案)。

标签: java opengl antialiasing slick2d artifacts


【解决方案1】:

由于GL_POLYGON_SMOOTH,这看起来有点像人工制品。

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

Chapter 6 的 OpenGL 红皮书状态:

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

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

当他们尝试启用GL_POLYGON_SMOOTH 时,几乎没有人能正确地完成大量工作。

【讨论】:

  • 听起来不错。有机会我去试试,谢谢!太糟糕了,没有办法从 slick2d 本身中做到这一点,但我想这可以工作。
【解决方案2】:

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

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

与安东的回答基本相同,但代码应该可以解决问题。

请注意,您首先绘制的内容将位于顶部,而不是您最后绘制的内容。所以你可能需要反转渲染顺序。

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 2016-04-24
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2014-02-18
    • 2021-02-12
    相关资源
    最近更新 更多