通过更新VBO

时间:2019-06-18 21:52:20

标签: c++ opengl textures

我正在尝试使用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;
}

我希望会绘制一些文本,但是会留下空白屏幕。

0 个答案:

没有答案