Java中的TrueType字体渲染?

时间:2012-05-04 17:11:48

标签: java opengl fonts rendering

我已经制作了一个包含多个组件的GUI,现在我需要用文本填充这些组件。

我的规格:

  • 优选使用LWJGL(OpenGL)
  • 不是特别复杂
  • 不使用任何其他外部库(禁止LWJGL库)
  • 必须进行相当优化,它将在非常fps密集的GUI上使用很多
  • 有可能被消除锯齿吗?
  • 可能具备在大多数主要操作系统上运行的能力

我怎么能在java中做到这一点?

2 个答案:

答案 0 :(得分:1)

您有三个选项:位图字体,纹理字体和矢量字体。

Bitmap fonts仅在您想要做的只是为2D GUI渲染文本时才有用。但是,如果使用位图字体,则无法执行抗锯齿。另一方面,它们非常易于使用,并且可以快速渲染。

纹理字体允许抗锯齿,但同样它们最适合2D GUI。如果要在世界空间中渲染文本,由于正在进行纹理缩放,您将获得大量工件。要使用纹理字体,您必须创建一个纹理图集,其中包含您要使用的特定字体的每个字符的图像(通常您希望将字符集限制为ASCII,否则纹理将太大) 。您可以使用AWT创建包含所需字符的矩形图像。然后,您可以通过渲染具有该角色的适当纹理坐标的四边形来渲染角色。建议使用亮度alpha纹理,以便将它与您希望文本所在的颜色混合。您可以通过使用每个字符的显示列表并对每个字符串进行优化,但是您会遇到问题与kerning等。

如果要在世界空间中渲染文本,矢量字体可以提供最佳效果。他们会给你完美的字体渲染,包括。 kerning,但渲染它们的成本更高。我通常的方法是为我想渲染的每个字符串创建一个路径(使用AWT),展平该路径,然后使用GLU tesselator跟踪它。这将为您提供一堆三角形,三角形条和三角形扇形,您可以将它们放入VBO中以获得最佳性能。然后,您可以通过为VBO发出适当的渲染命令来渲染该字符串。您可以使用每个字符串的显示列表进一步优化。这样,你只需要为每个字符串发送一个命令,但当然这仍然比其他方法更昂贵。

答案 1 :(得分:0)

我会考虑使用SVG,特别是Batik来管理字体。我自己做了很多,这有点像学习曲线。我会准备简单地开始,在担心性能之前找出你需要的特性。但是,在你提出更明确的想法之前,我不确定我们能提供更多的帮助