text - 为什么文本在游戏引擎中看起来如此糟糕?
问题描述
我会选择 Godot,因为这是我最近一直在使用的,但我在 Unity 上也看到了相同(或至少相似)的问题。
当我将文本添加到我的游戏世界时(例如向 UI 按钮添加文本以添加具体示例),默认情况下文本是一团糟。我必须非常小心地为每种字体选择一个确切的大小,然后仔细缩放以确保它可以轻松阅读。这与记事本甚至控制台终端形成鲜明对比,在那里我可以拥有几乎任何大小的几乎任何字体,并且一切看起来都很好。
我认为它与光栅化或引擎的其他一些基本假设有关,但这似乎是很久以前解决的问题。我错过了什么?为什么显示文字这么难?
解决方案
文本很难,因为许多重要细节的大小与像素大致相同。例如,组成字母的笔画宽度可能(理想情况下)比像素的宽度小一点或多一点。通常一个字母的位置在两个像素之间,要让它看起来和直接定位在一个像素上的同一个字母一样好是很困难的。文本有很多锐利、高对比度的边缘。这些锐利的边缘代表了自然图像中通常不会出现的极高空间频率。图形引擎用于缩放纹理的算法最适合“自然”图像,例如照片,它们的空间频率要低得多(即使这样通常也需要一些抗锯齿)。
一些图像格式包括“渲染意图”来区分这些类别,以便图形引擎可以将算法切换到最适合图像类型的算法。但是这种功能在 2D 引擎中比在 3D 游戏引擎中更常见。
文本在 2D 中看起来不错,因为 2D 图形引擎有很多专门用于在像素网格上很好地呈现文本的代码。字体提示、字体平滑和亚像素渲染是 2D 引擎使用的一些技术。3D 引擎具有类似命名的技术,但它们通常未针对文本进行优化。
如果您想深入了解渲染文本的问题(和解决方案),The Raster Tragedy是一个非常全面的资源。
为了使文本在 3D 引擎中看起来不错,有一些自定义着色器技术可以提供帮助,例如预过滤 MIP 贴图或有符号距离字段。
一般来说,如果您打算简单地将文本纹理贴到四边形上,那么您希望该纹理的分辨率至少与将投影到的屏幕区域一样大。您可能还想为文本纹理尝试与游戏中其他纹理不同的抗锯齿设置。
推荐阅读
- matlab - 在 MATLAB 上使用 ELSEIF & SWITCH/FUNCTION,将年龄转换为字符
- r - 根据列分隔列表的内容创建二进制分类变量
- c++ - 为什么我在头文件“'vector'之前的预期初始化程序”中收到此错误
- sql - 将单行转换为多行 Bigquery SQL
- php - 在 Laravel 中列出目录
- excel - 如何根据标题标签将excel单元格拆分为多列?
- ios - 每 60 秒观察一次 observable,并与它在 RxSwift 中的先前值进行比较
- .net - 基于 DataTrigger 更改 Material WPF 复选框的边框颜色
- django - Django - 帐户设置 BooleanField
- sql - 如何从组中选择特定行?