用c ++制作一个3d文本编辑器

时间:2011-04-04 16:55:00

标签: c++ linux user-interface opengl

目前我正在寻找为linux系统编写一个文本编辑器,它可以执行一些涉及opengl渲染的特定文本/字体突出显示。有没有人建议使用适合linux的c ++图形渲染库(特别是现在的ubuntu)?

非常感谢有关从何处开始渲染3D文本的建议!

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

5 个答案:

答案 0 :(得分:9)

在OpenGL级别基本上只有三种方法:

栅格字体。

使用glBitmap或glDrawPixels在屏幕上绘制一组矩形像素。这样做的缺点很多: 描述每个字符的数据每帧都从CPU发送到图形卡 - 以及帧中的每个字符。这可能相当于显着的带宽 底层的OpenGL实现几乎肯定必须以某种方式在CPU和帧缓冲区之间“混合”图像数据。
许多3D图形芯片根本不是为了绘制位图而设计的。在这种情况下,OpenGL软件驱动程序必须等到3D硬件完全完成绘制,然后才能将像素直接溅入帧缓冲区。在软件完成之前,硬件处于空闲状态 位图和Drawpixels必须平行于屏幕边缘对齐,因此无法旋转文本 缩放位图和Drawpixels是不可能的 Raster字体有一个显着的优点 - 那就是在纯软件OpenGL实现上,它们可能比其他方法更快......与3D硬件情况相反。

几何字体。 使用几何图元(线条,三角形等)绘制字体的字符。这样做的缺点是:
绘制一些字符所需的三角形数量可能非常大 - 特别是如果您希望它们看起来很好。这可能对性能不利 设计字体既困难又昂贵 使用彩色边框,阴影等进行字体处理会显着加剧其他两个问题。

优点是: 几何字体可以缩放,旋转,扭曲,变形,挤压 您可以使用精美的灯光模型,环境贴图,纹理等 如果在3D世界中使用,您可以使用它们执行碰撞检测 几何字体很好地缩放。它们没有表现出错误的锯齿伪影,并且它们在扩大时不会变得“模糊”。

纹理映射字体。 通常,整个字体存储在一个或两个大纹理贴图中,每个字母绘制为单个四边形。缺点是:
您需要的纹理贴图的大小可能必须非常大 - 特别是如果您需要大写和小写 - 和/或如果您想使字体在大点大小时看起来很好。这对于仅支持有限纹理贴图大小的硬件尤其是一个问题(例如3Dfx Voodoo只能渲染高达256x256的地图)
如果使用MIPmapping,则缩放字体会使其看起来模糊不清。如果你不使用MIPmapping,它看起来会很可怕。

优点是:
一般性 - 您可以为字体的每个字母使用任意全彩色图像。 纹理字体可以旋转和缩放 - 尽管它们看起来总是“扁平” 将其他类型的字体转换为纹理贴图很容易 您可以在3D场景中绘制它们,它们将被正确照亮 速度!纹理字体只需要将一个四边形发送到每个字母的硬件。这可能比Raster或Geometric字体快一个数量级。由于低端3D硬件已经过高度优化以绘制简单的纹理多边形,因此速度也得到提升,因为您通过渲染器“处于快速路径”。 (CAVEAT:在纯软件OpenGL上,纹理字体将是S-L-O-W。

链接到一些免费字体库:

答案 1 :(得分:6)

答案 2 :(得分:4)

我使用FTGL,它构建于 freetype 之上。要创建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);

答案 3 :(得分:1)

我建议你QT是GNOME的KDE或GTk +的基础。他们都支持OPENGL和文本。使用QT,你可以做高级图形(QGraphicsView),包括动画......看看QT演示应用程序。

答案 4 :(得分:0)

一个好的开始将是NeHe的OpenGL第14课。

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14