[英]SDL anti-aliasing without OpenGL?
我正在尝试使用SDL在C ++中制作游戏。 我想在图形中实现消除锯齿,但我在网上搜索的所有内容都提出了外部库或者也涉及OpenGL的解决方案。
有没有办法在没有OpenGL的情况下进行反别名(例如手头修改图形,或者可能是某些我没找到的功能)? 如果没有,将SDL编写的游戏转换为使用OpenGL有多难(我之前没有使用过OpenGL)?
一个老问题,但我有同样的问题。 让我解决那些没有答案的部分。
“有没有办法在没有OpenGL的情况下进行反别名(例如手头修改图形,或者可能是我找不到的某些功能)?如果不是,将SDL编写的游戏转换为使用OpenGL有多难同样(我之前没有使用OpenGL ......)“
1)我喜欢http://lazyfoo.net/上的OpenGL和SDL教程
一步一步,包括设置代码环境和库,专注于游戏编程。 更多图书馆的经验应该清理这个问题的后半部分。
2)我认为人们回答的问题与你提出的问题略有不同。
对于字体,SDL使用抗锯齿边创建Surface。 AA是静态的 ,但结果不像ColorKey那样(1 XOR 0)。 听起来像你只是想要与图像相同的东西。
如果这是你的问题,那么你当然可以在SDL中进行抗锯齿。 您可以在Alpha通道中存储您想要的任何内容(游戏设计师可以)。 您可以创建一个新通道并在运行时将其附加到图像。 在SDL中执行此操作只是一个坏主意,就是这样。 为了明白原因,让我补上一个
示例程序:
自己动手。 假设我们有一个带有白色键的mxn图像。 我们想要改进SDL_DisplayFormat()使用的颜色键过滤器。 创建Jerome,一个mxn浮点数组。 如果图像为白色,则将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:Jerome + = Maxine; 杰罗姆的唯一值已改变为'0'紧邻'1'。 它们现在的值介于0和1之间,具体取决于它们的邻居有多少非零。 现在(1-Jerome)给我们一个(粗略的)抗锯齿alpha通道。
在opengameart.org上讨论了可能出现的一些问题。
笔记:
I)过滤器可以更高效。 例如,我们可以检测并抛弃总和的零项,并通过重写总和(卷积)来收集加法。
II)如果我们可以通过规则给出透明度掩码,我们可以更快地工作。 字体是这种情况,由边缘定义。 任意图像具有任意掩模。 使用相同的技术会太慢。 SDL提供在字体上执行AA的原因与它*不提供图像的原因相同。 :)
III)图像中有很多像素,所有这些处理都可以在图像编辑器中使用良好的滤镜预先完成。
IV)滤波器也可以与所有像素并行完成,将四个通道作为(同时)矢量分量。 (..然后使用GPU)
对我来说,最后两点是问题的核心。 SDL是一个不好的地方。 如果边框是静态的,则提前处理。 如果在运行时确定边框,那么除了GPU之外,它在任何地方都是非常慢的。
希望这很有用! (而且我一直在寻找更正)。
您无法在SDL中动态消除图形别名,因为它不会动态转换精灵。
如果你想要你的精灵消除锯齿,那么在你的图像编辑器中进行它并将它们保存为支持alpha(.png)的格式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.