文本渲染是大多数新手难以理解的话题之一。而现在,我被困在这里。好吧,我想问一下我的方式是否是渲染文本的好主意.. OpenGL 没有将文本渲染到屏幕的内置功能,这让我很困惑。 搜索后,文本呈现使用位图。
加载并绑定(bind)位图字体纹理 -> 解析文本并生成并绑定(bind)顶点数组,使用 uv 数组映射纹理,... -> 将其渲染到屏幕
好的,这可能可以解决如何呈现文本,但我仍然卡住了。 (例如)如果我制作每毫秒更改一次的基于计时器的文本怎么办(因为我绘制的文本就像:Minute:Second:Mili Second)这不是个好主意,对吧?因为我想更改文本时必须重复该算法。我想如果我们继续使用位图,机器会变慢。
嗯,看到位图文本渲染这么慢,我想出了一些方法来渲染没有位图的文本 也许它会变得更好?这就是为什么我在这里问
这里是我如何用3d Vertex + GLOrtho 绘制角色模型,看看我的 vector 字体代码(示例) 如何用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 顶点绘制字符有一些优点,如果你想调整字体大小不会变得模糊。
现在的问题是,如果我制作每毫秒更改一次的基于计时器的文本,速度会变慢吗? 通过这种方式,如果我要更改文本,则无需重复算法。它们甚至不会消耗太多资源,因为它不是位图,它只是 vector 渲染。
最佳答案
that change every millisecond
首先,这需要 1000Hz 的显示更新频率才能显示。世界上没有显示那么快。最快的显示器大约管理 200Hz。因此,甚至不要考虑以该速率更新您的计时器显示。
关于显示的一个重要规则是:显示的数字不要超过您实际可以精确测量的数字。显示更新的精度在 1/10 秒的数量级,因此您应该只显示那么多。
如果你想存储一个游戏的截图,那么游戏更新的时间间隔决定了准确性。通常不超过 100Hz,即 1/100 秒。
既然你不想每帧都上传一个新的字符串纹理,那么常见的方法是使用字形纹理图集,即包含你想要渲染的每个字形的纹理,然后你可以从中绘制四边形通过纹理坐标寻址各个字符。为了节省纹理内存,您可以使用一些方法,例如 Distance Fields (例如在 libGDX 中实现)。
关于c++ - OpenGL,这是绘制文本的最佳方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070141/