我有一个非常简单的着色器,它应用了一个直接的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();
答案 0 :(得分:1)
简短版本为:glutStrokeString
,着色器不混合。
长版本是glutStrokeString
使用glTranslatef
(固定功能管道功能)前进到下一个字符位置。当然,对于纯粹基于着色器的管道,它不使用兼容性内置变量和不推荐使用的固定函数管道矩阵,这不起作用。
您最好的选择是使用glutStrokeString
重新实现glutStrokeCharacter
并使用glutStrokeWidth
自行应用字符位置提升。