慢慢移动精灵时获得"傻笑"效果

41 c# sprite unity-game-engine

慢慢移动精灵时,如何消除这种"傻笑"效果?

我已经尝试在Unity编辑器中调整抗锯齿值QualitySettings和滤镜模式,ImportSettings但这并没有改变任何东西.

在此输入图像描述

理想情况下,我希望将滤波器模式保持为Point (no filter)并且抗锯齿开启为2x

在此输入图像描述

精灵位于GameObject的Sprite Renderer组件内.

我在这里上传了我的Unity项目:http://www.filedropper.com/sprite

我真的不知道如何解决问题......任何人都可以帮助我的个人项目吗?

DMG*_*ory 59

我制作了一个快速动画来演示这里发生的事情:

动画演示波纹的来源

网格表示显示器的输出像素.如果我们能够以无限的亚像素分辨率渲染它,我已经覆盖了我们想要采样的滑动精灵.

每个网格单元中心的点代表它们的采样点.因为我们正在使用Nearest-Nieghbour/Point过滤,这是他们关注的纹理中唯一的一点.当新颜色的边缘穿过该采样点时,整个像素立即改变颜色.

源纹素网格与输出像素不对齐时会出现问题.在上面的例子中,精灵是16x16纹素,但我缩放它在显示器上占据17x17像素.这意味着,在每个帧的某个地方,一些纹素必须重复.当我们移动精灵时,这种情况会发生变化.

因为每个纹理像素都比像素略大,所以有一个时刻它完全桥接两个相邻像素的采样点.两个采样点都落在同一个放大的纹理像素内,因此两个像素都将纹素视为最接近的纹素,并且纹素在两个位置输出到屏幕.

在这种情况下,由于只有1/16的比例差异,每个纹素只在一个或两个帧的奇怪情况下,然后它转移到它的邻居,产生一个双倍像素的波纹,似乎在图像上滑动.

(可以将其视为一种莫尔条纹图案,它是由纹素网格和采样网格相互作用产生的,当它们不相似时)

修复方法是确保缩放像素,以便每个纹素显示为像素的整数倍.

1:1

动画以1:1的比例显示无波纹渲染

或者2:1,3:1 ......

动画以3:1的比例显示无波纹渲染

使用更高的倍数可使精灵以小于其自身纹素大小的增量移动,而不会影响艺术的预期外观.

因此:密切关注输出的分辨率和应用于资产的缩放,以确保它们之间保持整数倍关系.CAD97链接的博客文章包含您可以采取的实际步骤.

编辑:为了在您上传的Unity项目中进行演示,我修改了相机设置以匹配您的像素与单位设置,并进行了以下测试.顶部的Mario具有略微非整数的纹理像素比(1.01:1),而底部的Mario具有1:1.你只能看到顶级马里奥展出的涟漪文物:

两个马里奥斯,一个展出文物

  • 感谢一个很好的答案,那些GIF动画真的非常棒.当我对这个领域没有兴趣时,它让我停下来阅读并理解发生了什么!+1 (3认同)
  • 不完全是。如果我将精灵设为 3.5 倍正常比例,那么这会比上面的 3:1 示例更大,但它会再次产生波纹,因为我们再次有一个覆盖非整数像素的纹素。因此,为了避免纹波,请坚持使用整数大小。现在,您的对象将一次移动整个屏幕像素。如果您的图像较大,则 1 个屏幕像素将占图像总尺寸的一小部分,但屏幕上的物理尺寸仍然相同,因此您无法通过继续放大图像来获得精度或平滑度,除非相对意义上的。 (2认同)

CAD*_*D97 9

您可能对这篇关于在Unity中制作"像素完美"2D游戏的博客文章感兴趣.

一些相关的摘录:

如果您使用Unity中的所有默认设置开始您的像素游戏,它将看起来很糟糕!

让你的像素化游戏看起来不错的秘诀是确保你的精灵在一个漂亮的像素边界上渲染.换句话说,确保精灵的每个像素都在一个屏幕像素上渲染.

这些其他设置对于尽可能使事情变得清晰至关重要.

在精灵上:

  • 确保您的精灵使用无损压缩,例如真彩色
  • 关闭mipmapping
  • 使用点采样

在渲染质量设置中:

  • 关闭各向异性过滤
  • 关闭抗锯齿

通过创建使用Sprite/Default着色器并将其附加到SpriteRenderer的自定义材质,打开精灵着色器中的像素贴图.

此外,我只想指出,除非您正在应用物理,否则永远不要使用FixedUpdate.此外,如果你的精灵有一个Collider并且正在移动,它应该附加一个Kinematic RigidBody,即使你永远不会使用物理,告诉引擎Collider将会移动.