OpenGL,这是绘制文本的最佳方式吗?

时间:2014-01-12 01:19:39

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

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

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

确定这可以解决如何渲染文本,但我仍然坚持。 (例如)如果我将基于计时器的文本更改每毫秒(因为我绘制文本就像:分钟:秒:Mili Second),这不是一个好主意?因为我想要改变文本时必须重复该算法。我想如果我们继续使用位图,机器就会变慢。

好吧,看到位图文本渲染速度太慢,我在某种程度上渲染没有位图的文本 也许它会变得更好?这就是我在这里问的原因

这里是我用 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();
    }

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

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

1 个答案:

答案 0 :(得分:2)

  

每毫秒改变

首先,这需要1000Hz的显示更新频率才能表示。世界上没有显示 快。最快的显示器管理大约200Hz。所以,甚至不要考虑以该速率更新计时器显示。

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

如果您想存储游戏的屏幕截图,则游戏更新刻度间隔会确定准确性。通常不超过100Hz,即1/100秒。

既然你不想每帧都上传一个新的字符串纹理,那么常见的方法就是字形纹理图册,即一个纹理,你要在其中渲染每个字形,然后从中绘制四边形通过纹理坐标寻址各个字符。要保存纹理内存,您可以使用Distance Fields之类的方法(例如在libGDX中实现)。

另外,我建议您阅读此SO answer on OpenGL text rendering methods

相关问题