Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 在OpenGL中显示字体的最佳方式是什么?_Performance_Opengl_Fonts_Glsl_Transparency - Fatal编程技术网

Performance 在OpenGL中显示字体的最佳方式是什么?

Performance 在OpenGL中显示字体的最佳方式是什么?,performance,opengl,fonts,glsl,transparency,Performance,Opengl,Fonts,Glsl,Transparency,在OpenGL中,许多在屏幕上绘制文本的方法都是可能的。我想选择最好的,主要是最有效的方式。据我所知,您可以使用其中一种: 位图纹理: 大纲字体: 目前我正在使用位图字体,但问题是,我画的文本越多,FPS就越少。如果我画一行10个字符或5行10个字符,这真的很有意义 对于性能和质量来说,哪种字体技术最好? 我知道,我可以使用着色器绘制字体,这似乎是最好、最有效的解决方案,因为字体将存储在GPU内存中,但我不知道,如何使用GLSL着色器绘制字体 或者有更好的方法吗?也许使用功能代替位图字母生成,您

在OpenGL中,许多在屏幕上绘制文本的方法都是可能的。我想选择最好的,主要是最有效的方式。据我所知,您可以使用其中一种:

位图纹理:

大纲字体:

目前我正在使用位图字体,但问题是,我画的文本越多,FPS就越少。如果我画一行10个字符或5行10个字符,这真的很有意义

对于性能和质量来说,哪种字体技术最好? 我知道,我可以使用着色器绘制字体,这似乎是最好、最有效的解决方案,因为字体将存储在GPU内存中,但我不知道,如何使用GLSL着色器绘制字体


或者有更好的方法吗?

也许使用功能代替位图字母生成,您可以使用着色器使用更少的本地内存。如果行星是生成的,为什么不写信呢?谢谢你的快速回复!这并不能解决FPS低的问题,对吗?我希望能够以非常低的fps效果绘制大量文本。使用opencl,我只使用一个gpu内核进行绘制,它可以轻松地每秒绘制数百到数千个字符,但使用简单的行函数。这里是绿色的数字。听起来不错,但看起来不一样:D我想要这样的东西:这是我使用位图fontsI的东西。我正在开发一个gui,现在我选择使用字符构建纹理图集,并使用vao渲染文本。最终文本可以使用fbo呈现,然后您可能只显示一个包含整个文本的四边形,或者至少缓存一些段落示例我的尚未提交:
BMPbase = glGenLists(256);
for(int loop = 0; loop < 256; loop++)
{
cx = float(loop % 16) / 16.0f;
cy = float(loop / 16) / 16.0f;

glNewList(BMPbase + loop, GL_COMPILE);
glBegin(GL_QUADS);
glTexCoord2f(cx, 1 - cy);                       glVertex2i(0, 0);
glTexCoord2f(cx + 0.0625f, 1 - cy);             glVertex2i(Size, 0);
glTexCoord2f(cx + 0.0625f, 1 - cy - 0.0625f);   glVertex2i(Size, Size);
glTexCoord2f(cx, 1 - cy - 0.0625f);             glVertex2i(0, Size);
glEnd();

glTranslated(10, 0, 0);
glEndList();
}
glPushAttrib(GL_LIST_BIT);
glListBase(base - 32);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
Font = CreateFont(12,
0,
0,
0,
FW_BOLD,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY,
FF_DONTCARE|DEFAULT_PITCH,
"Times New Roman");

wglUseFontOutlines(hdc,
0,
255,
base,
0.0f,
0.5f,
WGL_FONT_POLYGONS,
GMF);