Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 3 of 3

Thread: Strange texture behavior when rendering a glyph with FreeType.

  1. #1
    Newbie Newbie
    Join Date
    Feb 2018
    Posts
    2

    Question Strange texture behavior when rendering a glyph with FreeType.

    I'm attempting to render a glyph with OpenGL and FreeType.

    OpenGL part of the program
    Code :
    int main()
    {
      glfwInit();
      glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
      glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
      GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);
      glfwMakeContextCurrent(window);
      gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
      int w, h;
      glfwGetFramebufferSize(window, &w, &h);
      glViewport(0, 0, w, h);
      glEnable(GL_BLEND);
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
      GLuint shaderProg = loadShader();
      glUseProgram(shaderProg);
      GLuint uniform_tex = glGetUniformLocation(shaderProg, "tex");
      GLuint uniform_color = glGetUniformLocation(shaderProg, "color");
      GLfloat color[4] = { 1, 1, 1, 1 };
      glUniform4fv(uniform_color, 1, color);
     
      FT_Library  library;
      FT_Face face;
      FT_Init_FreeType(&library);
      FT_New_Face(library, "C:\\Windows\\Fonts\\Arial.ttf", 0, &face);
      FT_Set_Pixel_Sizes(face, 0, 64); // rendering depends on what value I pass to this function
      FT_Load_Char(face, 117, FT_LOAD_RENDER);
     
      GLuint tex;
      glActiveTexture(GL_TEXTURE0);
      glGenTextures(1, &tex);
      glBindTexture(GL_TEXTURE_2D, tex);
      glUniform1i(uniform_tex, 0);
      glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_RED,
        face->glyph->bitmap.width,
        face->glyph->bitmap.rows,
        0,
        GL_RED,
        GL_UNSIGNED_BYTE,
        face->glyph->bitmap.buffer);
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
      float vertices[] = {
        0,  1,  0,  0,
        0,  0,  0,  1,
        1,  1,  1,  0,
        1,  0,  1,  1
      };
      GLuint vbo, vao;
      glGenVertexArrays(1, &vao);
      glBindVertexArray(vao);
      glGenBuffers(1, &vbo);
      glEnableVertexAttribArray(0);
      glBindBuffer(GL_ARRAY_BUFFER, vbo);
      glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);
      glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
     
      while (!glfwWindowShouldClose(window))
      {
        glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        glfwSwapBuffers(window);
        glfwPollEvents();
      }
      glfwTerminate();
      return 0;
    }

    Vertex shader
    Code :
    #version 330 core
     
    layout (location = 0) in vec4 coord;
    out vec2 texpos;
     
    void main(void) {
      texpos = coord.zw;
      gl_Position = vec4(coord.xy, 0, 1);
    }

    Fragment shader
    Code :
    #version 330 core
     
    in vec2 texpos;
    uniform sampler2D tex;
    uniform vec4 color;
     
    out vec4 fragColor;
     
    void main(void) {
      fragColor = vec4(color.rgb, texture2D(tex, texpos).r);
    }

    This rendering is produced when text height is 64
    Click image for larger version. 

Name:	64.jpg 
Views:	23 
Size:	5.6 KB 
ID:	2676

    This rendering is produced when text height is 256
    Click image for larger version. 

Name:	256.jpg 
Views:	22 
Size:	5.0 KB 
ID:	2677

    For some other text sizes like 255, 256 or 512 it works. But for 1024 or 64 it again becomes like on the first picture.

    Can someone explain this behavior?
    Thanks!
    Last edited by Leo2018; 02-23-2018 at 05:50 AM.

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,925
    Quote Originally Posted by Leo2018 View Post
    Code :
      glTexImage2D(...);
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    Those calls are in the wrong order. You need to call glPixelStore() before uploading the texture data. Pixel storage modes affect the process of reading and writing rectangular blocks of pixels to or from textures and framebuffers. They aren't properties of a texture object.

    I can't guarantee that's related to your problem, but incorrect alignment is a common cause of "skewed" textures.

  3. #3
    Newbie Newbie
    Join Date
    Feb 2018
    Posts
    2
    yes! this solved the problem. Thank you!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •