首页 文章

glutStrokeString和着色器 - 所有字符都在彼此之上

提问于
浏览
-1

我有一个非常简单的着色器,它应用了一个直接的WVP转换 . 它适用于某些几何体,但是如果我用glutStrokeString绘制一个字符串,那么所有字符都会相互重叠 .

是否可以使用自定义着色器绘制字符串,如果是这样,着色器如何捕获字符串中单个字符的转换?

这是我的着色器:静态const char * pVS =“\ n \ #version 330 \ n \ \ n \ layout(位置= 0)在vec3位置; \ n \ \ n \ uniform mat4 Projection; \ n \ uniform mat4查看;
\ n \ uniform mat4 World;
\ n \ \ n \ out vec4颜色; \ n \ \ n \ void main()\ n \ {\ n \ gl_Position = Projection * View * World * vec4(Position,1.0);
\ n \ Color = vec4(clamp(Position,0,1),1.0);
\ n }“;

static const char* pFS = "                                                          \n\
#version 330                                                                        \n\
\n\
in vec4 Color;                                                                      \n\
\n\
out vec4 FragColor;                                                                 \n\
\n\
void main()                                                                         \n\
{                                                                                   \n\
FragColor = Color;                                                              \n\
}";

这里是绘图代码:glUniformMatrix4fv(projection_shader,1,GL_FALSE,(const GLfloat *)&camera_projection); glUniformMatrix4fv(view_shader,1,GL_FALSE,(const GLfloat *)&camera_transform); glUniformMatrix4fv(world_shader,1,GL_FALSE,(const GLfloat *)&world_transform);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);

unsigned char s[] = "test";
world_transform = scale(mat4(1), vec3(1.0f / glutStrokeLength(GLUT_STROKE_ROMAN, s)));
glUniformMatrix4fv(world_shader, 1, GL_FALSE, (const GLfloat*)&world_transform);
glutStrokeString(GLUT_STROKE_ROMAN, s);

glutSwapBuffers();

1 回答

  • 1

    简短版本是: glutStrokeString 并且着色器不混合 .

    长版本是 glutStrokeString 使用 glTranslatef ,一个固定的函数管道函数,前进到下一个字符位置 . 当然,使用纯粹基于着色器的管道,这不起作用 .

    你最好的选择是使用 glutStrokeCharacter 重新实现 glutStrokeString 并使用 glutStrokeWidth 自己应用角色位置推进 .

相关问题