我正在实现一个基于OpenGL构建的GUI.我遇到了每个GUI都有的问题 - 文本渲染.我知道在OpenGL中渲染文本的几种方法,但是,我想知道哪种方法最适合GUI.
通常在GUI中我们有两种类型的文本 - 静态和实时.静态很容易 - 我们可以将TTF渲染到纹理并忘记它.这是"现场"文本,更让我烦恼 - 想象控制台,或多人游戏中的实时聊天.
我想到了几个选择:
因此问题是 - 如何有效地在OpenGL中呈现文本?
如果这有帮助,我将使用STL/Boost-heavy C++进行编码,并针对GForce 6及更高版本的显卡.
我没有选择使用OpenGL方法(即glxxx()方法).我只需要使用gl方法绘制文本.读完红皮书后,我明白只有通过这种glBitmap()方法才有可能.如果这是唯一可行的方法,那么任何人都可以帮助我获取所有字符的像素数组信息.有没有其他方式来绘制文字?
关于OpenGL字体渲染有很多问题,其中许多问题都是由纹理图集(快速但错误)或字符串纹理(仅限固定文本)所满足.
然而,这些方法很差,似乎已经过时了(使用着色器更好/更快地做到这一点怎么样?).对于OpenGL 4.1,有一个很好的问题,看看"你今天应该使用什么?":
那么,今天我们应该在iOS GL ES 2上使用什么?
我很失望,似乎没有开源(甚至是商业解决方案).我知道有很多团队把它搞砸了,花了几周的时间重新发明这个轮子,逐渐学习如何克服和空间等(呃) - 但必须有一个比重写整个"字体"更好的方法从头开始?
据我所知,这有两个部分:
对于1(如何渲染),Apple提供了许多方法来获得"正确的"渲染输出 - 但"简单"的方法不支持OpenGL(也许其他一些方式 - 例如是否有一种简单的方法来映射CoreText输出到OpenGL?).
对于2(如何显示),我们有着色器,我们有VBO,我们有字形纹理,我们有查找纹理,以及其他tecniques(例如上面链接的OpenGL 4.1内容?)
以下是我所知道的两种常见的OpenGL方法:
我也看过,但听到了好的和坏的事情:
在Apple自己的OS /标准库中,我知道几种文本呈现源.注意:我已经在2D渲染项目中详细使用了大部分这些,我关于它们输出不同渲染的陈述是基于直接经验
我开始在这家公司工作,使用2D OpenGL实现来显示我们系统的数据(在Windows上运行.)整个系统是用C++构建的(使用C++ Builder 2007).事实是,当你放大时,他们在那里打印的所有文字都是像素化的,我认为这是因为文本是位图:

据我所知,他们使用与Windows相同的字体文件.我在这里询问为什么会发生这种情况,我得到的答案是实现它的人(在公司不再工作)说OpenGL上的字体很难,这是他能做的最好的事情或类似的东西.
我的问题是:是否有任何简单有效的方法使文本也成为一个矢量(与图片中的那些线相同的方式是什么?)所以当我缩放相机时,这种情况发生了很多,它们没有像素化.我对OpenGL知之甚少,如果你有一些与此相关的指南和/或教程指向正确的方向,我会非常感激.基本上任何材料都会很棒.
我一直在尝试使用 glutBitmapCharacter() 渲染文本。
到目前为止,这是我所拥有的 2D 文本渲染功能:
void drawString(int x, int y, char* string) {
int i, len;
glDisable(GL_TEXTURE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2i(x, y);
for (i = 0, len = strlen(string); i < len; i++) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (int)string[i]);
}
glEnable(GL_TEXTURE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
}
Run Code Online (Sandbox Code Playgroud)
在场景渲染函数中,我进行了这个调用:
drawString(0, 0, "TESTING");
Run Code Online (Sandbox Code Playgroud)
这些是唯一将显示任何文本的 x 和 y 值,在这种情况下,“TESTING”出现在屏幕中间,“TE”为红色(我想要的颜色),“STING”为黑色。
我看到的处理这个函数的所有代码都使用了早期版本的 openGL 和不推荐使用的代码,所以我不知道该怎么做。