一个老问题,但我也有同样的问题。让我来解决没有答案的部分。
“有没有办法在不使用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
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 之外的任何地方都非常慢。
希望这很有用! (而且我一直在寻找更正)。