【问题标题】:OpenGL, Is this the best way to draw text?OpenGL,这是绘制文本的最佳方式吗?
【发布时间】:2014-01-30 22:48:47
【问题描述】:

文本渲染是大多数新手难以理解的主题之一。而现在,我被困在这里。好吧,我想问一下我的方式是渲染文本的好主意.. OpenGL 没有将文本渲染到屏幕的内置功能,这让我感到困惑。 搜索后,文本渲染使用的是位图。

加载并绑定位图字体纹理 -> 解析文本并生成并绑定顶点数组,将纹理映射到 uv 数组,... -> 将其渲染到屏幕上

好的,这可能可以解决如何呈现文本,但我仍然卡住了。 (例如)如果我使 基于计时器的文本毫秒 更改一次(因为我绘制文本就像:分:秒:米秒)这不是一个好主意对?因为当我想更改文本时,我必须重复该算法。我想如果我们继续使用位图,机器会变慢。

好吧,看到位图文本渲染太慢了,我想办法在没有位图的情况下渲染文本 也许会好起来?这就是我在这里问的原因

这里是我用 3d Vertex + GLOrtho 绘制角色模型的方法,看看我的矢量字体代码(示例) 如何用Vector画出“L”字

    const float MAX_HEIGHT = 18.0f; //set maximum height of character
    const float MAX_WIDTH = 20.0f;  //set maximum width of character

void drawL(GLfloat x,GLfloat y){
           glPushMatrix();
        //i've set before glOrtho(0, Window.width, Window.height, 0, 0, 1);
        glTranslatef(x,y,0.0f);
        glBegin(GL_QUADS);
        glVertex3f(0.0f,0.0f,0.0f);       //draw vertical quad
        glVertex3f(3.0f,0.0f,0.0f);
        glVertex3f(3.0f,MAX_HEIGHT,0.0f);
        glVertex3f(0.0f,MAX_HEIGHT,0.0f);

        glNormal3f(0.0f,MAX_HEIGHT,0.0f);  //draw horizontal quad
        glVertex3f(2.0f,MAX_HEIGHT,0.0f);
        glVertex3f(MAX_WIDTH - 10.0f,MAX_HEIGHT,0.0f);
        glVertex3f(MAX_WIDTH - 10.0f,MAX_HEIGHT - 3.0f,0.0f);
        glVertex3f(2.0f,MAX_HEIGHT - 3.0f,0.0f);
        glEnd();
        glPopMatrix();
    }

如果我们用矢量/GL_QUAD 顶点绘制字符有一些优点,如果你想调整字体大小不会变得模糊。

如果我制作基于计时器的文本每毫秒更改一次,现在的问题会变慢吗? 通过这种方式,如果我要更改文本,重复算法是不必要的。它们甚至不会消耗太多资源,因为它不是位图,它只是矢量渲染。

【问题讨论】:

标签: c++ opengl bitmap rendering text-rendering


【解决方案1】:

每毫秒变化一次

首先,这需要 1000Hz 的显示更新频率才能表示。世界上没有任何显示器能那么快。最快的显示器大约管理 200Hz。因此,甚至不要考虑以这种速度更新您的计时器显示。

关于显示的一个重要规则是:显示的数字不要超过您实际可以准确测量的数字。显示更新的精度大约为 1/10 秒,因此您应该只显示这么多。

如果您要存储游戏的屏幕截图,则游戏更新滴答间隔决定了准确性。通常不超过 100Hz,即 1/100 秒。

现在,由于您不想每帧都上传新的字符串纹理,因此常见的处理方法是字形纹理图集,即带有您要在其中渲染的每个字形的纹理,然后您可以从中绘制四边形通过它们的纹理坐标来处理各个字符。为了节省纹理内存,您可以使用Distance Fields 之类的方法(例如在libGDX 中实现)。

我也推荐阅读这篇SO answer on OpenGL text rendering methods

【讨论】:

  • 我明白了,所以它还在使用 birmap/纹理?我明白了,是真的吗?如果我们要渲染带有纹理的文本,我们必须上传每个字符的位图数据,所以如果我们想画回不同的字符,就不需要再上传了,因为我们之前已经上传了每个字符。
  • @Rizky:是的,这就是一般的想法。 OpenGL 本身非常不适合光栅化字形(这是我实际上正在研究的问题)。当然,一旦您想要渲染涵盖很多不同字形(想想日文或中文)的脚本,您很快就会得到非常大的字形纹理图集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2019-08-12
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多