没有OpenGL的SDL抗锯齿?

时间:2011-11-12 00:02:02

标签: c++ sdl antialiasing

我正在尝试使用SDL在C ++中制作游戏。 我想在图形中实现消除锯齿,但是我在网上搜索的所有内容都建议使用外部库或者也包含OpenGL的解决方案。

有没有办法在没有OpenGL的情况下进行反别名(比如手头修改图形,或者可能是某些我没找到的功能)?如果没有,将SDL编写的游戏转换为使用OpenGL有多难(我之前没有使用过OpenGL)?

2 个答案:

答案 0 :(得分:2)

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

  

“有没有办法在没有OpenGL的情况下进行反别名(例如手头修改图形,或者可能是我找不到的某些功能)?如果没有,转换用SDL编写的游戏有多难也使用OpenGL(我之前没有使用过OpenGL)。“

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

2)我认为人们回答的问题与你提出的问题略有不同 对于字体,SDL使用抗锯齿边创建Surface。 AA是静态,但结果不像ColorKey那样(1 XOR 0)。 对我来说听起来就像你只想用图像一样。

如果这是您的问题,那么您当然可以在SDL中进行抗锯齿处理。您可以在Alpha通道中存储您想要的任何内容(游戏设计师可以)。您可以创建一个新通道并在运行时将其附加到图像。在SDL中执行此操作只是一个坏主意,就是这样。要明白原因,让我来补充一下

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

说我们到此为止。 α为0是100%透明的。所以(1-Jerome)将他变成了一个alpha通道。例如,退出SDL,将(1-Jerome)追加为通道4,将图像保存为.png。使用SDL_DisplayFormatAlpha将其加载到SDL中。结果应与在原始图像上使用颜色键相同。 Crummy过滤器,但很快。

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

(半径可以是2个或更多像素,或者我们可以完全使用其他功能。无论我们想要什么)。 对所有白色像素执行此操作。例如,创建第二个数组Maxine,初始化为零。对于Jerome中“1”的每个条目,将T和t添加到Maxine。根据需要一次执行尽可能多的像素。然后将Maxine添加到Jerome: 杰罗姆+ =马克西姆;  杰罗姆的唯一值已改变为'0'紧邻'1'。它们现在的值介于0和1之间,具体取决于它们的邻居有多少非零。现在(1-Jerome)给了我们一个(粗略的)抗锯齿alpha通道。

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

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

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

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

IV)滤波器也可以与所有像素并行完成,将四个通道作为(同时)矢量分量。 (..然后使用GPU)

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

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

答案 1 :(得分:0)

您无法动态地对SDL中的图形进行消除锯齿,因为它不会动态转换精灵。

如果你想让你的精灵消除锯齿,那就在你的图像编辑器中进行,并将它们保存为支持alpha(.png)的格式