问题描述
我会选择 Godot,因为这是我最近一直在使用的,但我在 Unity 上也看到了相同(或至少类似)的问题。
当我在我的游戏世界中添加文本时(比如向 UI 按钮添加文本以添加具体示例),默认情况下文本是一团乱麻。我必须非常小心地为每种字体选择一个确切的大小,然后也仔细缩放以确保它可以轻松阅读。这与例如记事本甚至控制台终端形成对比,在那里我可以使用几乎任何大小的几乎任何字体并且一切看起来都很好。
我认为这与引擎的光栅化或其他一些基本假设有关,但这似乎是很久以前解决的问题。我错过了什么?为什么显示文本如此困难?
解决方法
文字很难,因为很多重要细节的大小与像素大致相同。例如,组成字母的笔画宽度(理想情况下)可能比像素的宽度小一点或多一点。通常一个字母的位置在两个像素之间的中间位置,要让它看起来和直接位于一个像素上的同一个字母一样好是很困难的。文本有很多锐利的、高对比度的边缘。这些锐利的边缘代表了通常不会出现在自然图像中的极高空间频率。图形引擎用于缩放纹理的算法最适合“自然”图像,例如照片,它们的空间频率要低得多(即使这样通常也需要一些抗锯齿)。
某些图像格式包含用于区分这些类别的“渲染意图”,以便图形引擎可以将算法切换到最适合图像类型的算法。但这种功能在 2D 引擎中比在 3D 游戏引擎中更常见。
文本在 2D 中看起来不错,因为 2D 图形引擎有很多专门用于在像素网格上很好地渲染文本的代码。字体提示、字体平滑和子像素渲染是 2D 引擎使用的一些技术。 3D 引擎具有类似命名的技术,但它们通常没有针对文本进行优化。
如果您想深入了解渲染文本的问题(和解决方案),The Raster Tragedy 是一个非常全面的资源。
为了使文本在 3D 引擎中看起来更好,有一些自定义着色器技术可以提供帮助,例如预过滤的 MIP 贴图或符号距离字段。
一般来说,如果您打算简单地将一个文本纹理贴在一个四边形上,那么您希望该纹理的分辨率至少与它将被投影到的屏幕区域一样大。您可能还想为文本纹理尝试不同的抗锯齿设置,而不是在游戏中使用其他纹理。