1
votes

I have recently used a freetype library to read text files and followed some guide on how to display text in 2D. I tried to extend the code to support 3D text rendering but i started having opengl related problems with it. At certain angles the text picture starts to fade, and the whole axis on which the text is located starts to inherit its colour. Fading; Black Slice

All the related code is:

Drawing function (inherited from learnopengl.com)

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Activate corresponding render state  
glActiveTexture(GL_TEXTURE0);
glBindVertexArray(VAO);
glEnableVertexAttribArray(0);

scale /= RESOLUTION;
vec2 start(x, y);
// Iterate through all characters
std::string::const_iterator c;
for (c = text.begin(); c != text.end(); c++)
{
    Character ch = Characters[*c];
    if (*c == '\r' || (x-start.x > xMax && xMax != 0.0f))
    {
        y += ((ch.Advance >> 6) + 16) * scale ;
        x = start.x;
        continue;
    }

    GLfloat xpos = x + ch.Bearing.x * scale;
    GLfloat ypos = y + (ch.Size.y - ch.Bearing.y) * scale;

    GLfloat w = ch.Size.x * scale;
    GLfloat h = ch.Size.y * scale;
    // Update VBO for each character
    GLfloat vertices[6][4] = {
        { xpos,     ypos - h,   0.0, 0.0 },
        { xpos,     ypos,       0.0, 1.0 },
        { xpos + w, ypos,       1.0, 1.0 },

        { xpos,     ypos - h,   0.0, 0.0 },
        { xpos + w, ypos,       1.0, 1.0 },
        { xpos + w, ypos - h,   1.0, 0.0 }
    };
    // Render glyph texture over quad
    glBindTexture(GL_TEXTURE_2D, ch.TextureID);

    // Update content of VBO memory
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
    // Render quad
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    // Now advance cursors for next glyph (note that advance is number of 1/64 pixels)
    x += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64)
}
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_BLEND);

Shader uniform initialization

ShaderBuilder::LoadShader(shader)->Add_mat4("projection", projection).Add_mat4("view", view).
    Add_mat4("model", model).Add_vec3("textColor", color).Add_texture("text", 0);

Vertex Shader #version 400 core layout (location = 0) in vec4 vertex; // out vec2 TexCoords;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main()
{
    vec2 vertexGL = (vertex.xy - vec2(400,300)) / vec2(400,300);
    vertexGL = vertex.xy;
    vec4 position = projection * view * model * vec4(vertexGL.xy, 0.0, 1.0);
    gl_Position = position / position.w;

    TexCoords = vertex.zw;
}  

Fragment Shader #version 400 core in vec2 TexCoords; out vec4 color;

uniform sampler2D text;
uniform vec3 textColor;

void main()
{    
    vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
    color = vec4(textColor, 1.0) * sampled;
    //color = vec4(1);
}  
1
Both images look like z-fighting.Jongware
indeed, but it questions me because there's no other rendering in there, only those letters, no huge infinite square or anything, what makes it even less z-fighting typical scenario is that it looks perfectly fine when looked directly into it, and starts to be messy only at small anglesuser3092114
Okay - thanks for checking and ruling that out.Jongware
I would like to add another behaviour, near close angles, the texture is somewhat modified, and transitions into what it apears to be, a z-fighting out of nowhere, as if there's some overflow. Demostration videouser3092114

1 Answers

0
votes

I finally found the mistake, for some unknown reason i thought normalizing my vertex coords after applying the matrix multiplication would be a good practice. Apparently it isn't.

vec4 position = projection * view * model * vec4(vertexGL.xy, 0.0, 1.0);
    gl_Position = position;// / position.w;

so as the commenting declares, this removed the mistake.