用C++制作一个3D文本编辑器

6

目前我正在寻找一种适用于Linux系统的文本编辑器,它需要进行特定的文本/字体高亮显示,并涉及OpenGL渲染。是否有人有关于在Linux(尤其是Ubuntu)上良好运行的C++图形渲染库的建议?

如果有关于如何开始渲染3D文本的建议,将不胜感激!

编辑:仅为澄清,渲染3D文本是该项目的严格要求。


1
您已发布了悬赏,这意味着您对收到的答案还不满意。能否提供更多细节,说明您正在寻找什么? - JCooper
1
我想制作一个文本编辑器,它具有使用一些3D对象的语法高亮功能。我不仅仅是在寻找OpenGL中的字体渲染,虽然这只是一个开始。其中一些答案是从Windows角度给出的,而这并不是我所针对的平台。基本上,我想找到一个可以在各种不同表面上渲染3D文本的库,但如果没有这样的库,我希望能够获得一些构建这样的库的提示。 - shuttle87
你说的“在各种不同的表面上”是什么意思?你想要将文本渲染到圆柱体或球体周围吗? - JCooper
@Jcooper,目前并不想在其他平面上渲染,但将来可能会考虑... - shuttle87
1
在我看来,OGLFT和FTGL似乎都可以做到您目前所要求的功能。两者都提供了加载字体和创建3D浮雕文字的功能。然而,它们都不允许您定义一个路径来扭曲文本。两者都允许您创建“文本纹理”,可以呈现在任意表面上,但此时它们将不再是浮雕的。 - JCooper
5个回答

10
在OpenGL层面上,基本上只有三种方法可以实现文字渲染:
光栅字体。
使用glBitmap或glDrawPixels将一堆像素矩形绘制到屏幕上。这样做的缺点很多: 每帧都从CPU向显卡发送描述每个字符的数据-并且对于帧中的每个字符都是如此。这可能会占用大量带宽。
底层OpenGL实现几乎肯定需要在CPU和帧缓冲区之间以某种方式“调整”图像数据。
许多3D图形芯片根本不设计绘制位图。在这种情况下,OpenGL软件驱动程序必须等待3D硬件完全完成绘制,然后才能进入切分像素直接插入帧缓冲区中。在软件完成此操作之前,硬件处于空闲状态。
位图和Drawpixels必须与屏幕边缘平行对齐,因此无法旋转文本。
位图和Drawpixels无法进行缩放。
光栅字体有一个重要优点-在仅有软件的OpenGL实现中,它们可能比其他方法更快...与3D硬件的情况相反。 几何字体。
使用几何原语-线条,三角形等来绘制字体的字符。这样做的缺点是:
有些字符所需的三角形数量可能非常大-特别是如果您希望它们看起来很好。这对性能不利。
设计字体既困难又昂贵。
使用彩色边框,投影阴影等会使其他两个问题更加严重。 优点是:
几何字体可以进行缩放,旋转,扭曲,变形,挤出。
您可以使用复杂的照明模型,环境映射,纹理等。
如果在3D世界中使用,则可以对其进行碰撞检测。
几何字体很好地缩放。它们不会出现糟糕的混淆伪像,并且当它们被放大时不会变“模糊”。 纹理映射字体。通常,整个字体都存储在一个或两个大的纹理图中,每个字母作为单个四边形绘制。其劣势是:
您需要的纹理地图大小可能会相当大 - 尤其是如果您需要大小写字母和/或如果您想使字体在大号字体下看起来漂亮。这在只支持有限纹理地图大小的硬件上尤其成问题(例如3Dfx Voodoo只能渲染高达256x256的地图)
如果使用MIP映射,则缩放字体会使其看起来有点模糊。如果不使用MIP映射,则会非常明显地出现走样。

优势是:
通用性-您可以为字体的每个字母使用任意全彩色图像。 纹理字体可以旋转和缩放-尽管它们总是“平面”的。 很容易将其他类型的字体转换为纹理地图。 您可以在3D场景中绘制它们,并且它们会被正确照明。 速度!每个字母仅需要发送一个四边形到硬件。这可能比光栅或几何字体快一个数量级。由于低端3D硬件高度优化了绘制简单纹理多边形,因此速度也得到提高,因为您通过渲染器处于“快速路径”。 (警告:在仅软件OpenGL中,纹理字体会很慢。)

一些免费字体库的链接:


2
你很好地总结了shuttle87将要遇到的陷阱。我有点感觉他们不太欣赏他们所寻求的麻烦。 - drewish

6

Freetype: http://freetype.sourceforge.net/index2.html And: http://oglft.sourceforge.net/

Freetype是一款免费的字体渲染引擎,它可以在各种操作系统上处理字体文件,并将其转换为可用于屏幕显示或打印的图像。OGLFT是一个基于OpenGL的字体渲染库,它提供了高质量的字体呈现效果,并支持多种语言和字符集。


4

我使用基于freetypeFTGL库。要创建3D浮雕文字,我需要进行以下调用:

#include <FTGL/ftgl.h>
#include <FTGL/FTFont.h>
...
FTFont* font = new FTExtrudeFont("path_to_Fonts/COOPBL.ttf");
font->Depth(.5);    // Text is half as 'deep' as it is tall
font->FaceSize(1);  // GL unit sized text
...
FTBBox bounds = font->BBox("Text");
glEnable(GL_NORMALIZE); // Because we're scaling
glPushMatrix();
glScaled(.02,.02,.02);
glTranslated(-(bounds.Upper().X() - bounds.Lower().X())/2.0,yy,zz); // Center the text
font->Render("Text");
glPopMatrix();
glDisable(GL_NORMALIZE);

1
我推荐您使用QT作为KDE的基础,或者使用GTK+作为GNOME的基础。两者都支持OPENGL和文本。使用QT,您可以进行高级图形(QGraphicsView)设计,包括动画效果...请查看QT演示应用程序。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接