Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL渲染字体实例_Java_Opengl_Fonts_Render - Fatal编程技术网

Java OpenGL渲染字体实例

Java OpenGL渲染字体实例,java,opengl,fonts,render,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=

我想用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,其中四个四元组彼此相邻,适合文本。在那里,他将纹理词存储在顶点中。 但这不是很无效吗?我还想更改文本的内容


有人知道解决我问题的好方法吗?

既然你提到了四边形,我就假设你正在处理成对的三角形。一直以来,OpenGL规范中都不推荐使用四边形

要设置渲染,可以创建一个缓冲区,其中包含多个并排的矩形,每个矩形上投影一个字符。正如您所说,这可以使用VAO+VBO组合来完成。这是我个人做这件事的方式

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

渲染文本的方式是使用
glBindTexture()
绑定字体纹理。接下来,使用
glBindVertexArray()
绑定VAO,最后使用单个
glDrawerElements()
调用绘制VAO。因此,无论您需要多少文本,您只需发出一次drawcall


这里最重要的是尽量减少您发出的抽签通知的数量。抽签电话的费用相对较高,因此适当地将其最小化是一条可行之路。这就是存在实例化渲染的原因;多次绘制完全相同的对象,而不会产生太多的绘制调用开销。但是,在这种情况下,最好将所有内容都放在一个缓冲区中,然后发出一个draw调用来绘制它。

感谢您的快速响应。我将使用您描述的方法:)实际上,您现在应该使用VAO+VBO组合绘制所有几何体。这确实是有效绘制几何图形的最佳方法。