【问题标题】:SDL anti-aliasing without OpenGL?没有 OpenGL 的 SDL 抗锯齿?
【发布时间】:2011-11-12 00:02:01
【问题描述】:

我正在尝试使用 SDL 用 C++ 制作游戏。 我想在图形中实现抗锯齿,但我在网上搜索的关于该主题的所有内容都建议使用外部库或也涉及 OpenGL 的解决方案。

有没有办法在没有 OpenGL 的情况下进行抗锯齿(例如事先修改图形,或者可能是我没有找到的某些功能)?如果不是,那么将用 SDL 编写的游戏也转换为使用 OpenGL 有多难(我之前没有使用过 OpenGL……)?

【问题讨论】:

  • 再次大声朗读这个问题。听起来真的可能有一个令人满意的答案吗?这样的答案听起来像什么?像“是的,你可以做抗锯齿”之类的东西。满足你的好奇心吗?
  • 我主要是在寻找一个是的,它可以用 SDL 来完成(以防我错过了什么),这就是方法。或者不,你不能只使用 SDL,你最好的选择是(OpenGL/第三方)。到目前为止,我还没有发现任何只使用 SDL 的东西,我想知道我是否遗漏了什么,或者我是否必须使用另一个库。
  • @Shalmezad 你到底想做什么?你希望它看起来如何?
  • @Pubby 我创建的许多图形都非常像素化,因为我无法将轮廓与图像的背景混合(在我的例子中是洋红色)。因此,我认为最简单的方法是查看 SDL 是否可以执行抗锯齿。直到您在下面的回答,我才意识到我可以只使用支持透明度的图像类型而不是使用颜色键控图像,这样我就可以事先创建抗锯齿图像。

标签: c++ sdl antialiasing


【解决方案1】:

一个老问题,但我也有同样的问题。让我来解决没有答案的部分。

“有没有办法在不使用OpenGL的情况下进行抗锯齿(例如预先修改图形,或者可能是我没有找到的一些功能)?如果没有,转换用SDL编写的游戏有多难也可以使用 OpenGL(我之前没有使用过 OpenGL……)”

1) 我喜欢 OpenGL 和 SDL 教程 http://lazyfoo.net/
一步一步,包括代码环境和库的设置,专注于游戏编程。更多的图书馆经验应该可以解决这个问题的后半部分。

2) 我认为人们回答的问题与您提出的问题略有不同。
使用字体,SDL 创建具有抗锯齿边缘的曲面。 AA 是静态,但结果不像 ColorKey 那样 (1 XOR 0)。 在我看来,您只是想要与图像相同的东西。

如果这是您的问题,那么您当然可以在 SDL 中进行抗锯齿。您可以在 Alpha 通道中存储您想要的任何内容(游戏设计师会这样做)。您可以创建一个新通道并在运行时将其附加到图像中。在 SDL 中这样做是个坏主意,仅此而已。要知道为什么,让我编一个

示例程序:
自己做。假设我们有一个 m x n 图像,带有白色键。我们想要改进 SDL_DisplayFormat() 使用的颜色键过滤器。创建 Jerome,一个 m x n 浮点数组。如果图像为白色,则将 Jerome 设置为 1。将所有其他值保留为 0。

假设我们到此为止。 alpha 为 0 表示 100% 透明。所以(1-Jerome)把他变成了一个阿尔法通道。例如,退出 SDL,将 (1-Jerome) 添加为通道 4,将图像另存为 .png。使用 SDL_DisplayFormatAlpha 在 SDL 中加载它。结果应该与在原始图像上使用颜色键相同。糟糕的过滤器,但速度很快。

让我们做得更好。取任何白色像素 W,并在所有八个面上倾倒一些透明度。将 T% 添加到相邻像素,并将较小的数量 t% 添加到对角像素,如下所示:
t                                                          
W T
t                                                                                                           

(半径可能是 2 或更多像素,或者我们可以完全使用另一个函数。任何我们想要的)。 对所有白色像素执行此操作。例如,创建第二个数组 Maxine,初始化为零。对于 Jerome 中的每个“1”条目,将 T's 和 t's 添加到 Maxine。一次做尽可能多的像素。然后将 Maxine 添加到 Jerome: 杰罗姆 += 玛克辛; 钳制为 1。 Jerome 唯一改变的值是紧邻“1”的“0”。它们现在是介于 0 和 1 之间的某个值,具体取决于它们的邻居中有多少非零。现在 (1-Jerome) 为我们提供了一个(粗略的)抗锯齿 Alpha 通道。

discussion at opengameart.org 可能会出现一些问题。

注意事项:
I)过滤器可以做得更有效。例如,我们可以检测并丢弃总和的零项,并通过重写总和(卷积)来收集加法。

II) 如果我们可以按规则给出透明度掩码,我们可以更快地工作。字体就是这种情况,字体是由它们的边缘定义的。任意图像具有任意掩码。使用相同的技术会太慢。 SDL 提供对字体执行 AA 的原因与它 *doesn'*t 提供对图像执行 AA 的原因相同。 :)

III) 图像中有大量像素,所有这些处理都可以在图像编辑器中使用良好的过滤器提前完成。

IV)过滤器也可以并行处理所有像素,将四个通道作为(同时)矢量分量。 (..所以使用 GPU)

对我来说,最后两点是问题的核心。 SDL 是一个糟糕的地方。如果边框是静态的,则提前处理。如果边界是在运行时确定的,那么除了 GPU 之外的任何地方都非常慢。

希望这很有用! (而且我一直在寻找更正)。

【讨论】:

    【解决方案2】:

    您不能在 SDL 中动态消除图形锯齿,因为它不会动态转换精灵。

    如果您希望您的精灵消除锯齿,请在您的图像编辑器中执行此操作并将它们保存为支持 alpha (.png) 的格式

    【讨论】:

    • 完美。想了很多,但不太确定,因为我对 SDL 还有些陌生。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多