-1

我有一个非常简单的着色器,它应用了一个简单的 WVP 变换。它适用于某些几何图形,但如果我用 glutStrokeString 绘制一个字符串,那么所有字符都被绘制在彼此的顶部。

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

这是我的着色器: static const char* pVS = " \n\ #version 330 \n\ \n\ layout (location = 0) in vec3 Position; \n\ \n\ uniform mat4 Projection; \n\ uniform mat4 View ;
\n\统一的mat4世界;
\n\ \n\ out vec4 颜色;\n\ \n\ void main() \n\ { \n\ gl_Position = 投影 * 视图 * 世界 * vec4(Position, 1.0);
\n\ 颜色 = 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();
4

1 回答 1

1

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

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

您最好的选择是重新实现glutStrokeStringusingglutStrokeCharacter并自己使用glutStrokeWidth.

于 2013-11-04T10:39:33.650 回答