渲染分辨率独立文本


11

我需要一种在游戏中绘制分辨率独立的文本的方法。也就是说,我需要能够放大文本,并且永远都看不到像素伪像。

谁能对我的建议提出任何建议?


我认为您需要研究基于矢量的字体而不是光栅化字体的方法,这可能是一个起点。我不是这方面的专家,所以我会让愿意知道答案的人来。
Ray Dey

Answers:


7

有三种常见的方法可以做到这一点。并不是要完全消除工件(除非有无限的内存或处理器时间,否则这是不可能的),而是如何以适合您现有代码和目标平台的方式最小化工件。

首先,只需使用字体光栅化程序(通常是FreeType)就可以在放大时将字体光栅化为所需的大小。这在屏幕截图中看起来不错,但速度非常慢。您可以通过缓存大小来解决速度过慢的问题,但是这却变得非常耗费内存。它的运动效果也不佳,因为要使字形在静态显示中看起来不错,就需要对其进行非均匀缩放。不过,如果您使用的平台上有足够的内存(例如PC),并且您的缩放比例会限制在较小的范围内(例如10像素到30像素),则这是一种选择。这种方法本身也不允许很多眼神的糖果。

其次,您可以将文本存储为网格。有一些库可以做到这一点,例如GLTT,或者您可以编写自己的库。现在您不再具有像素伪像,但是如果您将其放大得非常近,您将拥有多边形伪像-就像3D游戏中的任何其他网格一样。由于可以应用顶点着色器,并且网格可以与您执行的任何其他世界图形交错,因此网格文本允许很多视觉效果。由于它只是一个标准的网格,因此在内存和CPU上都比较轻巧,并且易于度量其成本。集成到基于基于子画面的普通2D渲染管道中可能会很痛苦。

第三,您可以将距离字段与像素着色器结合使用。这是一种相对较新的技术,目前很流行,使用简单的着色器对预制的纹理进行采样,并在视频卡上进行“免费”双线性过滤,以清晰地放大字形。与其他方法相比,它使用的内存很少且易于预测-每个字体的每个字符集有0.5MB到1MB的纹理。它非常适合基于sprite的渲染管道,因为它基于sprite。每个字形仍是带纹理的四边形。它确实会产生像素伪像,但与缩放纹理的其他方法相比却很少。如果像素着色器不可用,则还会有固定功能的后备,但文本最终会非常混叠。因为采样是在像素着色器中完成的,所以它便宜一些,可以使人眼花,乱,例如轮廓和阴影。


3

还有来自Loop和Blinn的Microsoft Research 的研究文章,内容涉及使用着色器渲染分辨率独立的曲线。它建议使用提出的技术以独立于分辨率的方式呈现TrueType文本。


1

您需要使用曲线和直线的组合来构建字体字符,然后在运行时将其转换为具有适当详细程度的几何图形。

幸运的是,大多数字体已经由贝塞尔曲线构建。要获取曲线数据,您只需要使用标准的Windows GetGlyphOutline()函数即可提取它们。

我不确定是否可以在不使用PInvoke的情况下从C#获取曲线数据。


1
为了使这个跨平台的而不用担心PInvoke的东西,在我看来,您将能够编写一个工具来将GetGlyphOutline读取的数据转储到某种自定义格式(请参阅SO问题),然后游戏代码中的一些简单文件I / O,仅加载您自定义存储的字形数据。
cket

0

您可能想看看freetype。我不知道它是否可以在您的平台上使用,或者该许可证是否适用,但是它是一个非常好的开源库,用于呈现实型字体和其他矢量字体。我相信他们必须做一些巧妙的律师规避代码,以使字体以美观的方式呈现。真正的类型方式涉及曲线上的字节码,以向渲染器提供提示,以使重要的字体功能(例如,垂直和衬线)不会像使用标准朴素的抗锯齿功能那样被模糊掉。这项技术拥有一项专利,因此,自由字体制作人不得不想出其他能够完成这项工作的东西,并且不会引起(我认为)苹果公司那可怕的律师野兽的攻击。无论如何,撇开法律不谈,尝试研究freetypehttp://freetype.sourceforge.net/index2.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.