- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读并运行以下教程( http://learnopengl.com/code_viewer.php?code=in-practice/text_rendering )后,我学会了如何在 OpenGL 中使用 freetype 渲染文本。我现在想知道是否可以避免为每个字形调用 glDrawArrays 。因此,我对 VBO 进行了一些修改,将其用于整个字符串而不是一个字形。作为第一步,我使用了字符串“AA”,并且由于两个字形相同,因此它们也共享相同的纹理。因此运行以下代码不是问题:
glGenVertexArrays(1, & textVAO);
glBindVertexArray(textVAO);
glGenBuffers(1, &textVBO);
glBindBuffer(GL_ARRAY_BUFFER,textVBO);
glBufferData(GL_ARRAY_BUFFER, 24* 2* sizeof(float), NULL, GL_DYNAMIC_DRAW);
glVertexPointer( 4, GL_FLOAT, 0, NULL);
后跟:
textShader.Use();
glm::vec3 color;
color = glm::vec3(1.0, 0.7f, 0.9f);
glUniform3f(glGetUniformLocation(textShader.Program, "textColor"), color.x, color.y, color.z);
glBindVertexArray(textVAO);
glActiveTexture(GL_TEXTURE0);
int k=0;
for(c = text.begin(); c != text.end(); c++){
Character ch = Characters[*c];
GLfloat xpos = x + ch.Bearing.x * scale;
GLfloat ypos = y - (ch.Size.y - ch.Bearing.y) * scale;
GLfloat w = ch.Size.x * scale;
GLfloat h = ch.Size.y * scale;
V.block(0,k,24,1) << xpos, ypos + h,0.0,0.0,xpos, ypos,0.0,1.0,xpos + w, ypos,1.0,1.0,xpos, ypos + h,0.0,0.0,xpos + w,ypos,1.0,1.0,xpos + w, ypos+h,1.0,0.0;
k++;
x += ( (ch.Advance >> 6) * scale);
}
glBindTexture(GL_TEXTURE_2D,66);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,textVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, 24* 2* sizeof(float), V.data());
glDrawArrays(GL_TRIANGLES,0,4*3);
glBindTexture(GL_TEXTURE_2D,0);
glDisableClientState(GL_VERTEX_ARRAY);
glUseProgramObjectARB(0);
我希望能够在屏幕上渲染“AB”或“ZW”,所以我现在尝试将 GL_TEXTURE_2D_ARRAY 与 glTexImage3D 和 glTexSubImage3D 一起使用。再次为了简化,我使用“AA”以使字形具有相同的宽度和高度。所以我添加了
GLuint textureArray;
glEnable(GL_TEXTURE_2D_ARRAY);
glGenTextures(1, &textureArray);
glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 30, 35, 2, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
前面代码的第一部分和第二部分变成:
textShader.Use();
glm::vec3 color;
color = glm::vec3(1.0, 0.7f, 0.9f);
glUniform3f(glGetUniformLocation(textShader.Program, "textColor"), color.x, color.y, color.z);
glBindVertexArray(textVAO);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D_ARRAY);
for(c = text.begin(); c != text.end(); c++) {
Character ch = Characters[*c];
GLfloat xpos = x + ch.Bearing.x * scale;
GLfloat ypos = y - (ch.Size.y - ch.Bearing.y) * scale;
GLfloat w = ch.Size.x * scale;
GLfloat h = ch.Size.y * scale;
V.block(0,k,24,1) << xpos, ypos + h,0.0,0.0,xpos, ypos,0.0,1.0,xpos + w, ypos,1.0,1.0,xpos, ypos + h,0.0,0.0,xpos + w,ypos,1.0,1.0,xpos + w, ypos+h,1.0,0.0;
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, k, 30,35, 1, GL_RED, GL_UNSIGNED_BYTE, ch.pointeur);
k++;
x += ( (ch.Advance >> 6) * scale);
}
glBindTexture(GL_TEXTURE_2D_ARRAY,textureArray);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,textVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, 24* 2* sizeof(float), V.data());
glDrawArrays(GL_TRIANGLES,0,4*3);
glBindTexture(GL_TEXTURE_2D,0);
glDisableClientState(GL_VERTEX_ARRAY);
glUseProgramObjectARB(0);
代码可以编译,但屏幕上没有显示任何内容。所以我想知道我是否正确使用了 GL_TEXTURE_2D_ARRAY 以及是否必须执行着色器的“数组版本”。我正在使用 OpenGL 4.5,谢谢。
最佳答案
(至少)有两个问题。
首先,您使用的是固定功能管道,它不能与数组纹理一起使用。访问内容的纹理环境不知道如何处理它们。如果您想使用数组纹理,则必须使用着色器。
其次,即使您使用着色器,您也做错了。话又说回来,教程教给你的是错误的(在本例中,教程教的做法非常糟糕,对 OpenGL 用户造成了积极的损害)。您将每个字形放入其自己的数组层中。嗯,许多 OpenGL 实现 only support 256 array layers ,如果您想包含非英语文本,这并不是很多字形。
进行字形渲染的正确方法是构建字形的纹理图集,而不是使用每个纹理的字形(如蹩脚的教程所做的那样)或每个数组层的字形(如您所做的那样)。您可以将多个字形放在单个 2D 纹理的不同位置,然后使用纹理坐标来选择要使用的字形。这将允许您通过一次绘制调用提交整个文本 block 。
如今,2D 纹理大小可以达到 16K(以像素为单位)以上。即使只有 4096x4096 纹理,您也可以将超过 16000 个 32x32 字形放入其中。
关于opengl - 在 opengl 中使用 freetype 的纹理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37327410/
我有点困惑设置字符大小对象的字符宽度和高度字段(示例来自 FreeType tutorial 中所述) error = FT_Set_Char_Size( face, /*
我正在尝试使用 freetype 枚举字体文件中的字形(名称和 unicode)。 为了获取名称,我使用了 FT_Get_Glyph_Name。但是我怎样才能得到字形 unicode 值呢? 我是字形
它运行在 OS X 10.9 上。我使用 brew 和 FreeType v2.5.2 安装了 GraphicsMagick。但是当我在程序中使用 gm Convert 时,出现此错误: { [Err
项目设置: GameProject [此项目包含游戏代码] GameProject-Android GameProject-桌面 GameProject-robovm [这是一个无需使用任何自由字体即
尝试在 Ubuntu Linux 86-64 上编译 freetype 2.6.1 时,我在配置步骤收到以下消息: /usr/local/include/harfbuzz/hb-common.h:31
当字符串确实包含我使用的默认字体中不存在的字符时,如何告诉 freetype 使用后备字体? 我需要在我的应用程序中正确呈现非拉丁字形。 我必须自己管理回退吗? 如果是这样:如何检测给定字符串中是否缺
我已将“arial.ttf”文件(从我的/Windows/Fonts 文件夹中获取)加载到内存中,但是将其传递到 FT_New_Memory_Face 时会崩溃(在 FT_Open_Face 中的某处
我正在尝试使用 FreeType 为微 Controller 创建位图字体,但我对坐标表达方式的根本差异感到困惑。我的微 Controller 期望字形位图相对于左上角的原点有 X 和 Y 偏移,而
我正在编写一个 DirectX WindowsPhone 应用程序,我需要使用 FreeType。好吧,我已经下载了 FreeType 源代码并使用 CMake 为 WP ARM 生成 Visual
所以我尝试在我的图形引擎中使用带符号的距离字段实现字体渲染。 为此,我使用 FreeType 库生成所有字母的字形。具体来说,我正在尝试像这样加载单色位图: FT_Load_Char(face, c,
我目前正在尝试创建仅包含字形外部边界、内部没有任何填充的字形位图。为此使用 FreeType 库。这是我的代码,类似于 FreeType 引用中的示例 2 代码: Spans outlineSpans
我正在渲染文本,我需要字体的大写高度达到一定的像素数。例如,在下面的标志中,我需要让 SPEED 和 LIMIT 的高度相同,在本例中为 45 px,因此我将字体大小设置为45(我现在明白这不是一个好
我正在尝试使用 FreeType 2.4.11在我使用 openGL 渲染文本的项目中。 虽然我初始化了库,但只将 charmap 设置为 unicode 一次。在每次绘制的字符循环中使用 FT_Lo
我正在尝试创建单色字形图集,但遇到了问题。 Freetype 在字形的位图中呈现“废话”。我责怪 freetype,因为一些字形仍然正确呈现。 生成的纹理图集: 为什么会这样,我该如何解决? 但是我仍
我尝试在 OpenGL 和 FreeType2 中渲染文本,但我不知道如何在渲染字体时获取每行之间的空间(以像素为单位)。当我解析文本时,我希望能够做类似的事情 const char *text =
我正在尝试使用 AIDE 应用程序直接从我的手机使用 freetypefontgenerator。我已完成本文中显示的所有步骤:https://github.com/libgdx/libgdx/wik
这个问题与以下内容密切相关 Is there a way to programmatically determine if a font file has a specific Unicode Gly
我对 Mac OS X 环境比较陌生。 我试图安装 freetype 库以在 OpenGL 中显示文本,但我失败了。 我在一些论坛上读到 freetype 预装了 Mac OS X 山狮。 我只是想确
以前版本的 FreeType 有一个方法 setScale() 现在我可以使用以下方法更改比例: bitmapFont.getData().SetScale(); 但是我遇到了字母间距问题: /ima
使用 FreeType (2.10.1) 在我的游戏引擎中实现文本渲染,我遇到了奇怪的字形,包含重复四次的字母,在 x 轴上镜像并颠倒。 在所需的字母上方似乎有被解释为字形的相邻内存,它在每次运行时都
我是一名优秀的程序员,十分优秀!