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

标签 c++ opengl bitmap rendering text-rendering

文本渲染是大多数新手难以理解的话题之一。而现在,我被困在这里。好吧,我想问一下我的方式是否是渲染文本的好主意.. 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 中实现)。

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

关于c++ - OpenGL,这是绘制文本的最佳方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070141/

相关文章:

c++ - C++ 中单例的线程安全惰性构造

c++ - 我如何找到 C++ 编译器认为定义为常量的内容?

c++ - DirectX — 是否有 DirectDraw 表面 Flip() 的类似物?

c++ - vsync "wait"(阻塞)在什么时候发生?

android - 在 Android Nougat 上拍摄照片后,BitmapFactory 无法从 Uri 解码位图

c++ - CMake 在我的主机中找不到用于交叉编译器的 boost 库,但在 Raspberry Pi 中找到了

java - OpenGL 着色器 - 使用法线旋转顶点

opengl - 如何在 Ubuntu 上使用 Mesa 10.1 启用 OpenGL 3.3

go - 在 Golang 中将 GDI32.dll 位图保存到磁盘

java - 将位图加载到 Canvas 中并在其上绘制