为什么文本在游戏引擎中看起来如此糟糕?

Why does text look so bad in game engines?

我会选择 Godot,因为这是我最近一直在使用的,但我在 Unity 上也看到了相同(或至少相似)的问题。

当我在我的游戏世界中添加文本时(例如将文本添加到 UI 按钮以添加具体示例)默认情况下文本是一团乱麻。我必须非常小心地为每种字体选择一个确切的大小,然后仔细缩放它以确保它可以轻松阅读。这与记事本甚至控制台终端形成对比,在后者我可以使用几乎任何大小的几乎任何字体,而且一切看起来都很好。

我认为它与光栅化或引擎的其他一些基本假设有关,但这似乎是很久以前解决的问题。我错过了什么?为什么显示文字这么难?

文本很难,因为许多重要细节的大小与像素大致相同。例如,构成一个字母的笔画的宽度可能(理想情况下)比一个像素的宽度小一点或多一点。通常一个字母的位置在两个像素之间,要让它看起来和直接位于一个像素上的同一个字母一样好是很困难的。文本有很多锐利、高对比度的边缘。这些尖锐的边缘代表极高的空间频率,通常不会出现在自然图像中。图形引擎用于缩放纹理的算法最适合“自然”图像,例如照片,它们的空间频率要低得多(即使那样通常也需要一些抗锯齿)。

一些图像格式包括“渲染意图”以区分这些类别,以便图形引擎可以将算法切换到最适合图像类型的算法。但是这种功能在 2D 引擎中比在 3D 游戏引擎中更常见。

文本在 2D 中看起来不错,因为 2D 图形引擎有很多专门用于在像素网格上很好地呈现文本的代码。字体提示、字体平滑和子像素渲染是 2D 引擎使用的一些技术。 3D 引擎具有类似命名的技术,但它们通常未针对文本进行优化。

如果您想深入研究渲染文本的问题(和解决方案),The Raster Tragedy 是一个非常全面的资源。

要使文本在 3D 引擎中看起来不错,可以使用自定义着色器技术,例如预过滤 MIP 贴图或符号距离字段。

一般来说,如果您打算简单地将文本纹理贴到四边形上,那么您希望该纹理的分辨率至少与其投影到的屏幕区域一样大。您可能还想针对文本纹理尝试使用与游戏中其他纹理不同的抗锯齿设置。