Рендеринг текста с использованием openGL путем обновления VBO - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь сделать текст используя opengl.У меня правильно загружены шрифты в текстуру, и у меня правильные координаты UV для каждой буквы.Когда я пытаюсь обновить уже существующий VBO, чтобы он соответствовал тексту, который я хочу нарисовать, ничего не происходит.Я могу нарисовать всю текстуру или один символ, используя другой объект Image, который я создал заранее, поэтому я знаю, что UV и Texture верны.

Я попытался реорганизовать мои вызовы opengl, используя другую систему ввода для моих шейдеров, и в основном скопировал мой рабочий код изображения, но ничего не получалось.Единственное, что у меня есть, это то, что я использую glBufferSubData для обновления VBO с правильными координатами, чтобы нарисовать каждую букву.Я думаю, что это моя проблема, так как я не слишком опытен с этим методом рендеринга opengl.

Init

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);

Render

//*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);

Vertex Shader

#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;
}

Я ожидаю, что какой-то текст будет нарисован, но у меня остался пустой экран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...