边缘伪影#

在处理图像时,尤其是具有透明度的图像,图形卡可以在其边缘创建图形伪像。图片在不需要的地方可以有“边框”。例如,在左上角有一条线:

../../_images/p0.png

这一切为什么要发生?我们怎么解决这个问题呢?

为什么会出现边缘伪影#

当图像的边缘没有整齐地落在图像上时,就会发生这种情况。

边缘未对齐#

通常,当图像的边缘没有落在精确的像素边界上时,就会出现边缘瑕疵。在下面的图1中,左边的图像是128个像素的正方形,以(100,100)绘制,看起来很好。右侧的图像以(300.5,100)为中心绘制,并在左侧边缘显示为一条线的人工产物。如果在(100,300.5)而不是(100,300)绘制精灵,则不会出现该瑕疵。

../../_images/p1.png

图1:不在整数像素边界上的图像造成的边缘伪影。#

左边缘落在坐标300.5-(128/2)=236.5上。计算机试图选择236到237之间的平均颜色,但由于没有237,我们得到的是深色。通常,仅当边是透明的时才会发生这种情况。

高度或宽度不能被两个整除的形状也会产生瑕疵。如果形状的宽度为15个像素,则中心将落在第7个和第8个像素之间,从而使像素更难与屏幕对齐。

结垢#

缩放图像也会产生瑕疵。在图2中,第二个精灵缩小了三分之二。由于128像素不能均匀缩小三分之二,我们最终得到的是边缘伪像。如果我们缩小了一半,这是可能的128像素(64),所以不会有任何瑕疵。

图2中的第三幅图像放大了两倍。边缘跨越两个像素,我们最终也得到了一条线人工制品。(如果图像可以被四整除,则按2缩小通常有效。扩大规模通常不会。)

../../_images/p2.png

图2:缩放导致的边缘伪影。#

旋转#

使用旋转时,很难将像素排列在一起,而且边缘瑕疵很常见。

不正确的视区#

如果窗口的宽度为800,并且视口设为799或801,则也可以显示线条。或者,如果将视口左或右边缘设置为非整数,如23.5,则可能会出现瑕疵。

../../_images/p3.png

图3:错误的视区#

解决方案#

将精灵大小保持为2的幂,或者至少具有可被2整除的宽度和高度。对于像素艺术类型的游戏,使用 pixelated 绘图模式将极大地减少问题。

对齐到最近的像素#

默认情况下,Arcade使用名为“线性”的滤镜绘制精灵,该滤镜可实现更平滑的缩放和线条。如果你想要像素级的效果,你可以使用不同的滤镜,称为“最近”。该过滤器还可以减少边缘伪影的问题。

启用最近的筛选器 pixelated 绘制时的参数

def on_draw(self):
    self.my_sprite_list.draw(pixelated=True)

复查视区代码#

仔细检查您的视区代码,以确保仅将边设置为整数,并且窗口的大小完全匹配,没有任何偏离1的错误。