没有使用OpenGL的SDL抗锯齿技术?

4
我正在使用SDL编写C++游戏。我希望在图形中实现抗锯齿,但是我在网上搜索的所有内容都建议使用外部库或涉及OpenGL的解决方案。
是否有一种方法可以不使用OpenGL进行抗锯齿(例如预先修改图形或可能没有发现的某些功能)?如果没有,那么将SDL编写的游戏转换为使用OpenGL会有多难(我以前没有使用过OpenGL...)?

再次阅读问题,大声地对自己说一遍。它真的听起来可能有一个令人满意的答案吗?这样的答案会是什么样子?像“是的,你可以做抗锯齿。”这样的回答足以满足你的好奇心吗? - Kerrek SB
我主要是在找一个答案,即是否可以仅使用SDL来完成(如果我漏掉了什么)。如果是可以的,下面是方法。或者是否只能使用其他库,而无法仅依靠SDL来实现,这时最好的选择是(OpenGL/第三方库)。 到目前为止,我没有找到仅使用SDL实现的任何东西,我想知道是否有我错过的东西,或者我必须使用另一个库。 - Shalmezad
@Shalmezad 你具体想做什么?你想要它看起来怎么样? - Pubby
@Pubby 我创建的许多图形都非常像素化,因为我无法将轮廓与图像的背景(在我的情况下是色键,品红色)混合。所以,我想最简单的方法就是看看SDL是否能执行反锯齿处理。 直到你下面的回答,我才意识到我可以使用支持透明度的图像类型而不是使用颜色键图像,从而使我能够事先创建抗锯齿图像。 - Shalmezad
2个回答

3

一个老问题,但我也有同样的疑问。让我回答一些未被解决的部分。

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

1)我喜欢http://lazyfoo.net/上的OpenGL和SDL教程。
逐步介绍了代码环境和库的设置,重点是游戏编程。更多的库经验应该能够澄清这个问题的后半部分。

2)我认为人们回答了一个略微不同于您所问的问题。
对于字体,SDL创建具有平滑边缘的Surface。AA是静态的,但结果不像ColorKey那样是(1 XOR 0)。 听起来你只是想用图片做同样的事情。

如果您的问题是关于抗锯齿,那么在SDL中当然可以实现。您可以在alpha通道中存储任何想要的内容(游戏设计师这样做)。您可以在运行时创建一个新通道并将其附加到图像上。但在SDL中这样做只是一个不好的主意。为了看清原因,让我举个例子:
示例过程:
我们自己完成它。假设我们有一个m x n的图像,具有白色色键。我们想改进SDL_DisplayFormat()使用的颜色键过滤器。创建一个m x n的浮点数数组Jerome。在图像为白色的地方,将Jerome设置为1。将所有其他值保留为0。
假设我们到此为止。Alpha为0表示100%透明。因此(1-Jerome)将其转换为alpha通道。例如,退出SDL,将(1-Jerome)作为第4个通道附加,将图像保存为.png格式。使用SDL_DisplayFormatAlpha加载它。结果应该与在原始图像上使用颜色键相同。过滤效果不佳,但速度很快。
让我们把它变得更好。取任何一个白色像素W,在所有八个方向上添加一些透明度。将T%添加到相邻像素中,将较小的数量t%添加到对角线像素中,就像这样:
   t   T   t
T  W  T
   t   T   t



(半径可以是2个或更多像素,或者我们可以使用另一个函数。随意选择)。对所有白色像素执行此操作。例如,创建第二个数组Maxine,初始化为零。对于Jerome中的每个条目中的“1”,将T和t添加到Maxine中。一次处理尽可能多的像素。然后将Maxine添加到Jerome中:  Jerome += Maxine; 限制为1. Jerome只有'1'旁边的'0'值发生了变化。它们现在是介于0和1之间的某个值,具体取决于它们的邻居中有多少非零值。现在(1-Jerome)给我们一个(粗略的)抗锯齿阿尔法通道。
这里有一个关于可能出现的问题的opengameart.org上的讨论

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

II) 如果我们可以按照规则给出透明度掩码,我们可以更快地工作。这对于字体来说就是这种情况,它们是通过边缘定义的。任意图像都有一个任意的掩码。使用相同的技术会太慢。SDL提供执行AA字体的原因与其不提供对图像执行AA的原因相同。:)

III) 图像中有很多像素,并且所有这些处理都可以使用良好的过滤器在图像编辑器中预先完成。

IV) 过滤器也可以同时处理所有像素,将四个通道作为(同时的)向量分量。(因此使用GPU)

对我来说,最后两点是关键。SDL不是做这件事的好地方。如果边框是静态的,则预先处理它。如果边框在运行时确定,则除了GPU之外的任何地方都无法进行处理,因为速度太慢。

希望这有用!(我总是在寻找修正)。


0

在SDL中,您无法动态抗锯齿图形,因为它不会动态转换精灵。

如果您希望您的精灵具有抗锯齿效果,则应在图像编辑器中进行处理,并将其保存为支持alpha通道的格式(.png)。


太好了。我也想到了,但由于我对SDL还不是很熟悉,所以不太确定。 谢谢你的帮助! - Shalmezad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接