我正在尝试使用opengl渲染文本。我已将字体正确加载到纹理中,并且每个字母的UV坐标正确。当我尝试更新我现有的VBO以适合我要绘制的文本时,什么都没有发生。我可以使用预先创建的另一个Image对象绘制整个纹理或单个字符,因此我知道UV和Texture是正确的。
我尝试重新组织我的opengl调用,为我的着色器使用不同的输入系统,并基本上复制了工作的Image代码,但没有任何效果。我唯一的不同是,我使用glBufferSubData用正确的坐标更新vbo以绘制每个字母。我想这是我的问题,因为我不太精通opengl渲染方法。
初始化
for (int i = 0; i < LINE_LENGTH; i++) {
addPoint(x, y, 0.0, 1.0);//x0
addPoint(x, y, 0.0, 0.0);//x0
addPoint(x, y, 1.0, 0.0);//x1
addPoint(x, y, 0.0, 1.0);//x0
addPoint(x, y, 1.0, 0.0);//x1
addPoint(x, y, 1.0, 1.0);//x1
}
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*LINE_LENGTH*24,&vert[0],GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,sizeof(float)*4,(void*)0);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,sizeof(float)*4,(void*)(sizeof(float)*2));
//Unbind
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
渲染
//*LOOP TO UPDATE VALUES NOT SHOWN, TESTED AND IS CORRECT*//
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
Shader* s = Shader::useShader(CompiledWebWindow::TEXT_SHADER);
glm::vec3 color(1,0,0);
s->setVec3("textColor",color);
s->setMat4("projection",*(GLWin::getProjection()));
s->setInt("ourTexture",0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,textureId);
//Update data
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(float)*end*24,&vert[0]);
glDrawArrays(GL_TRIANGLES,0,end*6);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos; // <vec2 pos, vec2 tex>
layout (location = 1) in vec2 UV; // <vec2 pos, vec2 tex>
out vec2 TexCoord;
uniform mat4 projection;
void main()
{
gl_Position = projection * vec4(aPos, 1.0);
TexCoord = UV;
}
片段着色器
#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform vec3 textColor;
void main()
{
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(ourTexture, TexCoord).r);
FragColor = vec4(textColor, 1.0) * sampled;
}
我希望会绘制一些文本,但是会留下空白屏幕。