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

时间:2013-11-04 10:20:32

标签: opengl text shader

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

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

以下是我的着色器:     static const char * pVS =“\ n \     #version 330 \ n \     \ n \     vec3位置的布局(位置= 0); \ n \     \ n \     均匀mat4投影; \ n \     制服mat4查看;
    \ n \     统一mat4世界;
    \ n \     \ n \     out vec4颜色; \ n \     \ n \     void main()\ n \     {\ n \     gl_Position = Projection *查看* World * vec4(位置,1.0);
    \ n \     颜色= vec4(钳位(位置,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 个答案:

答案 0 :(得分:1)

简短版本为:glutStrokeString,着色器不混合。

长版本是glutStrokeString使用glTranslatef(固定功能管道功能)前进到下一个字符位置。当然,对于纯粹基于着色器的管道,它不使用兼容性内置变量和不推荐使用的固定函数管道矩阵,这不起作用。

您最好的选择是使用glutStrokeString重新实现glutStrokeCharacter并使用glutStrokeWidth自行应用字符位置提升。