我有一个非常简单的着色器,它应用了一个直接的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 回答
简短版本是:
glutStrokeString
并且着色器不混合 .长版本是
glutStrokeString
使用glTranslatef
,一个固定的函数管道函数,前进到下一个字符位置 . 当然,使用纯粹基于着色器的管道,这不起作用 .你最好的选择是使用
glutStrokeCharacter
重新实现glutStrokeString
并使用glutStrokeWidth
自己应用角色位置推进 .