实例化OpenGL渲染字体

时间:2017-01-17 14:09:16

标签: java opengl fonts render

我想用OpenGL渲染字体。我得到了一个带有我所有字符的纹理和一个文件,其中保存了纹理上数字的每个位置。

例如:

char id=40      x=167  y=0    width=21   height=74   xoffset=-3   yoffset=33   xadvance=59   page=0    chnl=0 
char id=41      x=188  y=0    width=21   height=74   xoffset=-3   yoffset=33   xadvance=59   page=0    chnl=0 

我想将它渲染到四边形上。但这通常是怎么做的?每个数字都有一个渲染调用?或者我应该渲染数字实例?这意味着我将纹理坐标和偏移等存储为我的VBO中的实例属性。 这将是最难的解决方案,而且必须更容易。 每次渲染调用可能需要很长时间才能渲染。

我已经看到了一个解决方案,其中创建了一个新的VAO + VBO,其中四边形彼此相邻,适合文本。在那里,他将textureCoords存储在顶点中。 但这不是非常无效吗?我还想改变文字的内容。

有没有人知道我的问题的好方法?

1 个答案:

答案 0 :(得分:1)

既然你提到四边形,我会假设你正在使用成对的三角形。 Quad早已被OpenGL规范弃用了。

要设置渲染,我们的想法是创建一个包含多个并排矩形的缓冲区,每个矩形都有一个投射在其上的单个字符。正如你所说,这可以使用VAO + VBO组合完成。这是我个人这样做的方式。

由于顶点可能具有不同的纹理坐标而不是共享纹理坐标,因此您需要分别使用纹理坐标定义每个顶点。那真的不低效;这是在OpenGL中实现渲染过程的必要条件。

呈现文本的方式是使用glBindTexture()绑定字体纹理。接下来,使用glBindVertexArray()绑定您的VAO,最后使用单个glDrawElements()调用绘制它。因此,您只需要发出一个简单的画面,但不管您需要多短文本。

这里最重要的是您最小化您发出的绘制呼叫的数量。绘制调用相对昂贵,因此适当地最小化它们是要走的路。这就是实例渲染存在的原因;多次绘制完全相同的对象,而没有多少绘制调用的开销。但是,在这种情况下,将所有内容放在一个缓冲区中并发出一个绘制调用来绘制它会好得多。