加载到openGL时,Freetype字形会换行

时间:2015-04-08 16:18:31

标签: c++ opengl c++11 glfw freetype

我正在尝试通过freetype加载TrueTypeFonts并使用openGL显示它们,这就是我得到的:

Font application

正如你所看到的那样,它很好但是如果你仔细观察每个字形似乎在边界周围有一些小的不协调。我注意到这些奇怪的线条实际上是从另一侧传输的像素。特别注意'T'和'h',你可以看到与纹理相对侧对应的小条。这也适用于不同的字体。以下是负责将字形位图缓冲区复制到openGL中的代码:

    void load(FT_GlyphSlot glyphSlot, double loadedHeight){
        this->loadedHeight = loadedHeight;
        int width = glyphSlot->bitmap.width;
        int height = glyphSlot->bitmap.rows;

        sizeRatios = Vector2D(width / loadedHeight, height / loadedHeight);
        offsetRatios = Vector2D(glyphSlot->bitmap_left / loadedHeight, glyphSlot->metrics.horiBearingY / loadedHeight);
        advanceRatios = Vector2D((glyphSlot->advance.x >> 6) / loadedHeight, (glyphSlot->advance.y >> 6) / loadedHeight);

        std::cout << width << ", " << height << std::endl;

        GLubyte * textureData = new GLubyte[width * height * 4];

        for(int y = 0; y < height; y++){
            for(int x = 0; x < width; x++){
                for(int i = 0; i < 4; i++){
                    textureData[(x + y * width) * 4 + i] = glyphSlot->bitmap.buffer[x + width * y];
                }
            }
        }

        texture.bind();
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        texture.load(GL_TEXTURE_2D, 0, GL_RGBA, glyphSlot->bitmap.width, glyphSlot->bitmap.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);
        // glGenerateMipmap(GL_TEXTURE_2D);

        delete [] textureData;
    }

字体面的大小在别处设置,并与我要加载的字形槽一起传递给此方法。纹理对象只是一个创建纹理句柄并跟踪它的类,加载只是将参数直接传递给glTexImage2D()。

我尝试使用模数旋转将像素移动一个,它垂直工作但不是水平工作。我还尝试通过将格式更改为GL_RED直接将缓冲区加载到加载中来加载纹理,如here所述,但问题不会消失,所以我认为它甚至可能是freetype中的一个缺陷?

我想知道是否有一些我不理解的纹理加载的基本元素。

如果您需要一些额外的源代码来了解错误,请询问。

1 个答案:

答案 0 :(得分:3)

GL_TEXTURE_WRAP_S / GL_TEXTURE_WRAP_T默认为GL_REPEAT

改为使用GL_CLAMP_TO_EDGE