在OpenGL中已经有很多关于文本呈现的问题,例如:
但主要讨论的是使用固定功能管道渲染纹理四边形。当然着色器必须有更好的方法。
我并不是真正关心国际化,我的大部分字符串都是情节刻度标签(日期和时间或纯数字)。但是这些图将以屏幕刷新率重新渲染,并且可能有相当多的文本(屏幕上不超过几千个字形,但足够硬件加速布局会很好)。
使用现代OpenGL进行文本渲染的推荐方法是什么? (引用现有软件使用该方法是很好的证据,它运作良好)
答案 0 :(得分:192)
答案 1 :(得分:14)
http://code.google.com/p/glyphy/
GLyphy和其他基于SDF的OpenGL渲染器之间的主要区别在于大多数其他项目将SDF采样为纹理。这具有采样所具有的所有常见问题。 IE浏览器。它扭曲了轮廓并且质量低劣。 GLyphy使用提交给GPU的实际向量代表SDF。这样可以获得非常高质量的渲染。
缺点是该代码适用于带有OpenGL ES的iOS。我可能会制作一个Windows / Linux OpenGL 4.x端口(希望作者会添加一些真实的文档)。
答案 2 :(得分:12)
最普遍的技术仍然是纹理四边形。然而在2005年,LORIA开发了一种称为矢量纹理的东西,即将矢量图形渲染为基元上的纹理。如果使用它将TrueType或OpenType字体转换为矢量纹理,则可以得到:
http://alice.loria.fr/index.php/publications.html?Paper=VTM@2005
答案 3 :(得分:7)
我很惊讶Mark Kilgard的宝贝, NV_path_rendering (NVpr),上面没有提到过。虽然它的目标比字体渲染更通用,但它也可以从字体和字距调整渲染文本。它甚至不需要OpenGL 4.1,但它目前只是一个供应商/ Nvidia扩展。它基本上使用glPathGlyphsNV
将字体转换为路径,这取决于freetype2库以获取指标等。然后您还可以使用glGetPathSpacingNV
访问字距调整信息并使用NVpr的一般路径渲染机制显示使用路径的文本 - "转换"字体。 (我把它放在引号中,因为没有真正的转换,曲线按原样使用。)
遗憾的是recorded demo for NVpr's font capabilities并不是特别令人印象深刻。 (也许有人应该在much snazzier SDF demo上找到一个可以在intertubes上找到的...)
2011年NVpr API演示文稿谈论字体部分starts here并继续next part;这个演讲是如何分裂的,这有点不幸。
关于NVpr的更多一般材料:
自从" stencil"在我的回答之前没有在这个页面上产生任何点击,看起来参与此页面的SO社区的子集尽管数量众多,却没有意识到基于模板缓冲区的无曲面,基于模板缓冲的路径/字体渲染方法一般来说。 Kilgard有一个FAQ-like post at on the opengl forum,它可以说明无曲面路径渲染方法与沼泽标准3D图形的不同之处,即使它们仍在使用[GP] GPU。 (NVpr需要一个支持CUDA的芯片。)
从历史角度来看,Kilgard也是经典"A Simple OpenGL-based API for Texture Mapped Text", SGI, 1997的作者,不应该与2011年推出的基于模板的NVpr混淆。
本页讨论的大多数(如果不是全部)最近的方法,包括基于模板的方法,如NVpr或基于SDF的方法,如GLyphy(我之前没有进一步讨论,因为其他答案已经涵盖了它)一个限制:它们适用于传统(~100 DPI)显示器上的大文本显示,在任何级别的缩放都没有锯齿,并且即使在小尺寸下,它们在高DPI,视网膜状显示器上也看起来很好。但是,它们并没有完全提供Microsoft的Direct2D + DirectWrite为您提供的功能,即在主流显示器上暗示小字形。 (有关提示的视觉调查一般见this typotheque page。更深入的资源是on antigrain.com。)
我不知道有任何开放的&产品化基于OpenGL的东西,可以做微软目前的暗示。 (我承认对Apple的OS X GL / Quartz内部构件一无所知,因为据我所知,Apple尚未发布他们如何进行基于GL的字体/路径渲染的东西。似乎OS X不同于MacOS 9,并没有暗示annoys some people。)无论如何,有one 2013 research paper that addresses hinting via OpenGL shaders由INRIA的Nicolas P. Rougier撰写;如果你需要从OpenGL中提示,那么它可能值得一读。虽然看起来像freetype这样的图书馆在提示方面已经完成了所有的工作,但由于以下原因,这实际上并非如此,我引用了该文章:
FreeType库可以使用RGB模式下的子像素消除锯齿来栅格化字形。 但是,这只是问题的一半,因为我们也想实现子像素 定位准确放置字形。显示纹理四边形 分数像素坐标不能解决问题,因为它只会产生纹理 整像素级插值。相反,我们希望实现精确的转变 子像素域中的(在0和1之间)。这可以在片段着色器[...]中完成。
解决方案并非完全无关紧要,所以我不打算在此解释。 (该论文是开放获取的。)
我从Rougier的论文中得到的另一件事(Kilgard似乎没有考虑过)是因为(Microsoft + Adobe)创造的字体功能不是一个而是两种字距调整规范方法。旧的基于所谓的 kern 表,它由freetype支持。新的称为GPOS,它只受到自由软件世界中较新的字体库如HarfBuzz或pango的支持。由于NVpr似乎不支持这些库中的任何一个,因此对于某些新字体,字距调整可能无法使用NVpr开箱即用;根据{{3}},有些人显然是在野外。
最后,如果您需要执行this forum discussion,您似乎目前在使用OpenGL时运气不佳,因为似乎不存在基于OpenGL的库。 (另一方面,DirectWrite可以处理CTL。)像HarfBuzz这样的开源库可以渲染CTL,但我不知道你是如何让它们运行良好的(如使用模板 - 基于方法)通过OpenGL。您可能必须编写胶水代码以提取重新形状的轮廓并将其作为路径提供给基于NVpr或SDF的解决方案。
答案 4 :(得分:3)
我认为你最好的选择是用OpenGL后端调查cairo graphics。
开发3.3核心原型时遇到的唯一问题是OpenGL后端不推荐使用的函数。这是1 - 2年前所以情况可能会有所改善......
无论如何,我希望将来桌面opengl图形驱动程序将实现OpenVG。