我使用的软件需要在屏幕上打印大量文本,大约200到400个字符串和许多唯一字符(某些对象由字符表示),该软件已经在使用OpenGL。 我已经解决了文本渲染问题,并且能够渲染文本,但是使用200 draw call lead绘制了200多个字符串会导致性能问题。
该软件仅以2D绘图。
重要的是要注意,我的软件在装有旧显卡的32位计算机上运行,不能使用2.0以上的最新版本的OpenGL。
您认为最好的选择是什么?
使用一个包含所有信息的大缓冲区,以每种字体一次绘制调用的方式呈现所有内容。
渲染纹理中的每个字符串,然后对每个字符串进行一次绘制调用。 (文本变化不大,最多每秒钟)
还有其他想法吗?
答案 0 :(得分:0)
据我了解,标准方法是制作字体图集纹理。在这里,您可以将字形栅格化到其中,并将栅格化字形的uv坐标保存到查找表中。然后批处理顶点,并使用单个纹理(您的图集)并为所有顶点位置使用一个缓冲区,在一次绘制调用中绘制所有文本。
所有字体和字符大小都可以写入相同的图集,只要您制作足够大的纹理即可。您可能还可以使用第二个Atlas纹理作为唯一字符。
答案 1 :(得分:0)
由于OpenGl不支持在屏幕上呈现字体,因此留给程序员来定义系统。
Freetype是一个很好的字体渲染库。
您可以将“字体纹理”渲染为四边形或制作“字体图集”,然后将其渲染为四边形
通常200个字符串应该没有挑战性,但是您可以检查带符号距离字段之类的技术。
这是一个在opengl中渲染字体的好教程。
答案 2 :(得分:0)
虽然我不认为我的文本渲染方式接近标准,但我将字体预渲染到一个巨大的字形映射中,并将元数据(字形的位置)存储到 ssbo 缓冲区(存储数组字形数据(位图和前进除外)。之后,当我需要渲染一堆文本时,我将字符代码转换为一组字形 ID。然后通过循环遍历它并且只传递每个字符的 vec2 位置和提示字形 Id,我通过读取 ssbo 中的数据将点转换为几何着色器中的矩形,将纹理坐标传递给片段着色器。
这种方法非常快,可以轻松渲染 10000 条文本。它还允许快速切换字体集,并且能够支持任何 unicode 字符,只要字体具有字形即可。
答案 3 :(得分:-2)
由于核心 OpenGl 库,即 GL 不支持在显示屏幕上表示字符/字体,因此由程序员定义系统。
GLUT (OpenGL Utility Toolkit) 是一个很好的库,可以与 GL 和 GLU 等其他库一起使用,通常位图表示方法对字体渲染很有用。 https://youtube.com/playlist?list=PLJFAs3UP25-6d4af7SRRy4Yoe_o16BxW9