关于opengl:glutStrokeString和着色器-所有字符彼此重叠

glutStrokeString and shaders - all characters on top of each other

我有一个非常简单的着色器,该着色器应用了straigthforward WVP变换。它在某些几何形状下可以正常工作,但是如果我用glutStrokeString绘制字符串,则所有字符都一个一个地绘制。

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

这是我的着色器:
静态const char * pVS =" n
#version 330 n
n
vec3位置中的布局(位置= 0); n
n
均匀的mat4投影; n
统一的mat4视图;
n
统一的mat4世界;
n
n
vec4颜色; n
n
void main() n
{ n
gl_Position =投影*视图*世界* vec4(位置1.0);
n
颜色= vec4(clamp(Position,0,1),1.0);
n
}";

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static const char* pFS ="                                                          
\
#version 330                                                                        
\

\
in vec4 Color;                                                                      
\

\
out vec4 FragColor;                                                                
\

\
void main()                                                                        
\
{                                                                                  
\
FragColor = Color;                                                              
\
}";

这是绘制代码:
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);

1
2
3
4
5
6
7
8
9
10
11
12
13
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();

简短的版本是:glutStrokeString和着色器不混合。

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

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