相关疑难解决方法(0)

如何为GUI进行OpenGL实时文本渲染?

我正在实现一个基于OpenGL构建的GUI.我遇到了每个GUI都有的问题 - 文本渲染.我知道在OpenGL中渲染文本的几种方法,但是,我想知道哪种方法最适合GUI.

通常在GUI中我们有两种类型的文本 - 静态和实时.静态很容易 - 我们可以将TTF渲染到纹理并忘记它.这是"现场"文本,更让我烦恼 - 想象控制台,或多人游戏中的实时聊天.

我想到了几个选择:

  • 没有特殊情况 - 每次文本更改时渲染和加载纹理,请记住只在实际出现新文本时重新渲染它,并尝试将较大的文本拆分为小部分(如每个聊天行).然而,这仍然会让我们陷入像记分线一直在变化的情况,或者是一个呈现"每个角色"的介绍文本(在一些科幻游戏中看到的打字机风格)
  • quad-per字符 - 这似乎也是一种流行的解决方案,您可以使用ASCII表格准备纹理并渲染纹理四边形字符.但是,我对这种解决方案的效率存在严重怀疑.提示如何加快速度也很受欢迎.
  • 混合解决方案 - 但我不知道如何干净利落地实施

因此问题是 - 如何有效地在OpenGL中呈现文本?

如果这有帮助,我将使用STL/Boost-heavy C++进行编码,并针对GForce 6及更高版本的显卡.

opengl performance text-rendering

41
推荐指数
3
解决办法
3万
查看次数

如何仅使用OpenGL方法绘制文本?

我没有选择使用OpenGL方法(即glxxx()方法).我只需要使用gl方法绘制文本.读完红皮书后,我明白只有通过这种glBitmap()方法才有可能.如果这是唯一可行的方法,那么任何人都可以帮助我获取所有字符的像素数组信息.有没有其他方式来绘制文字?

c c++ opengl graphics

37
推荐指数
4
解决办法
11万
查看次数

OpenGLES 2中的文本/字体渲染(iOS - CoreText?) - 选项和最佳实践?

关于OpenGL字体渲染有很多问题,其中许多问题都是由纹理图集(快速但错误)或字符串纹理(仅限固定文本)所满足.

然而,这些方法很差,似乎已经过时了(使用着色器更好/更快地做到这一点怎么样?).对于OpenGL 4.1,有一个很好的问题,看看"你今天应该使用什么?":

从版本4.1开始,OpenGL中的文本渲染技术是什么?

那么,今天我们应该在iOS GL ES 2上使用什么?

我很失望,似乎没有开源(甚至是商业解决方案).我知道有很多团队把它搞砸了,花了几周的时间重新发明这个轮子,逐渐学习如何克服和空间等(呃) - 但必须有一个比重写整个"字体"更好的方法从头开始?


据我所知,这有两个部分:

  1. 我们如何使用字体渲染文字?
  2. 我们如何显示输出?

对于1(如何渲染),Apple提供了许多方法来获得"正确的"渲染输出 - 但"简单"的方法不支持OpenGL(也许其他一些方式 - 例如是否有一种简单的方法来映射CoreText输出到OpenGL?).

对于2(如何显示),我们有着色器,我们有VBO,我们有字形纹理,我们有查找纹理,以及其他tecniques(例如上面链接的OpenGL 4.1内容?)

以下是我所知道的两种常见的OpenGL方法:

  1. 纹理图集(渲染所有字形一次,然后从共享纹理渲染每个字符1 x纹理四边形)
    1. 这是错误的,除非你使用20世纪80年代的"位图字体"(即便如此:纹理图集需要比看似更多的工作,如果你需要它更正确的非平凡字体)
    2. (字体不是"字形的集合",有大量的定位,布局,包装,间距,字距,样式,着色,加权等.纹理图集失败)
  2. 固定字符串(使用任何Apple类正确渲染,然后截取背景图像数据,并上传为纹理)
    1. 从人的角度来说,这很快.在帧渲染中,这非常非常慢.如果您使用大量更改文本执行此操作,则帧速率会在整个范围内显示
    2. 从技术上讲,它大多是正确的(不完全是:你以这种方式丢失了一些信息)但效率极低

我也看过,但听到了好的和坏的事情:

  1. Imagination/PowerVR"Print3D"(链接坏了)(来自制造GPU的人!但是他们的网站移动/删除了文本渲染页面)
  2. FreeType(需要预处理,解释,大量代码,额外的库?)
  3. ...和/或FTGL http://sourceforge.net/projects/ftgl/(谣言:慢?错误?很长时间没有更新?)
  4. 字体存储http://digestingduck.blogspot.co.uk/2009/08/font-stash.html(高质量,但非常慢?)
  5. 1.

在Apple自己的OS /标准库中,我知道几种文本呈现源.注意:我已经在2D渲染项目中详细使用了大部分这些,我关于它们输出不同渲染的陈述是基于直接经验

  1. CoreGraphics与NSString
    1. 最简单的:渲染"进入CGRect"
    2. 似乎是人们推荐的"固定字符串"方法的稍微快一点的版本(即使你期望它大致相同)
  2. UILabel和UITextArea用纯文本
    1. NB:他们不一样!他们如何渲染smae文本略有不同
  3. NSAttributedString,呈现给上面的一个
    1. 再次:渲染方式不同(我所知道的差异相当微妙并被归类为"错误",关于此的各种SO问题)
  4. CATextLayer
    1. iOS字体和旧C渲染之间的混合体.使用"不完全"免费桥接的CFFont/UIFont,它揭示了一些更多的渲染差异/陌生感
  5. CoreText
    1. ......最终的解决方案?但是它自己的野兽......

fonts core-animation opengl-es core-text ios

18
推荐指数
1
解决办法
6876
查看次数

OpenGL上基于矢量的字体

我开始在这家公司工作,使用2D OpenGL实现来显示我们系统的数据(在Windows上运行.)整个系统是用C++构建的(使用C++ Builder 2007).事实是,当你放大时,他们在那里打印的所有文字都是像素化的,我认为这是因为文本是位图:

视图示例

据我所知,他们使用与Windows相同的字体文件.我在这里询问为什么会发生这种情况,我得到的答案是实现它的人(在公司不再工作)说OpenGL上的字体很难,这是他能做的最好的事情或类似的东西.

我的问题是:是否有任何简单有效的方法使文本也成为一个矢量(与图片中的那些线相同的方式是什么?)所以当我缩放相机时,这种情况发生了很多,它们没有像素化.我对OpenGL知之甚少,如果你有一些与此相关的指南和/或教程指向正确的方向,我会非常感激.基本上任何材料都会很棒.

c++ opengl c++builder

5
推荐指数
1
解决办法
4749
查看次数

在 openGL 4 中渲染文本 - 不起作用

我一直在尝试使用 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 和不推荐使用的代码,所以我不知道该怎么做。

c++ opengl glut

1
推荐指数
1
解决办法
1883
查看次数