1

プログラムを実行すると、ウィンドウが約 3 秒間表示され (予想どおり白い背景が表示されますが、テキストは表示されません)、その後、FreeType コードにアクセス違反があったことを示すメッセージが表示されます。私のデバッグテキストはフォントが見つからなかったことを出力し、顔の幅と高さも使用できないため、エラーを返します。arial.ttf を .exe ディレクトリ、プロジェクト ディレクトリ、どこにでも置いてみました。サイコロはありません。これが私のmain.cppです:

int main()
{
        int running = GL_TRUE;

        debug.Print("Program initialized...");
        window.Create( 800, 600, "OpenGL");

        TEXT text;

        while( running )
        {
                glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
                glClear( GL_COLOR_BUFFER_BIT );

                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

                text.Create("The quick brown fox jumps over the lazy dog", "arial.ttf", 300, 400, 1, 1, 1,   2/600, 2/800);

                glfwSwapBuffers();
        }

        glDeleteTextures(1, &tex);

        glDeleteProgram( shaderProgram );
        glDeleteShader( fragmentShader );
        glDeleteShader( vertexShader );

        glDeleteBuffers( 1, &vbo );

        debug.Print("Program terminated.");
}

これが私のText.hです:

#ifndef _TEXT
#define _TEXT

#include "debug.h"
#include <GL/glew.h>
#include <GL/glfw.h>
#include <ft2build.h>
#include FT_FREETYPE_H

class TEXT
{
public:
        void Create(char* Text, char* fontName, int posx, int posy, int r, int g, int b, int sizex, int sizey);
};

#endif

これが私のText.cppです:

#define GLEW_STATIC
#include "text.h"

const char* textvertexSource =
        "version 150\n"
        "in vec4 coord;"
        "out vec2 texcoord;"
        "void main {"
        "       gl_Position = vec4(coord.xy, 0, 1);"
        "       texcoord = coord.zw;"
        "}";

const char* textfragmentSource =
        "version  150\n"
        "in vec2 texcoord;"
        "uniform sampler2D tex;"
        "uniform vec4 color;"
        "void main() {"
        "       gl_FragColor = vec4(1, 1, 1, texture2D(tex, texcoord).a * color;"
        "}";

void TEXT::Create(char* text, char* fontName, int posx, int posy, int r, int g, int b, int sizex, int sizey)
{

        // OpenGL functions
        GLuint vbo;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);

        GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
        glShaderSource( vertexShader, 1, &textvertexSource, NULL );
        glCompileShader( vertexShader );

        GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
        glShaderSource( fragmentShader, 1, &textfragmentSource, NULL );
        glCompileShader( fragmentShader );

        GLuint shaderProgram = glCreateProgram();
        glAttachShader( shaderProgram, vertexShader );
        glAttachShader( shaderProgram, fragmentShader );
        glBindFragDataLocation( shaderProgram, 0, "outColor" );
        glLinkProgram( shaderProgram );
        glUseProgram( shaderProgram );

        GLint posAttrib = glGetAttribLocation( shaderProgram, "coord" );
        glEnableVertexAttribArray(posAttrib);
        glVertexAttribPointer(posAttrib, 4, GL_FLOAT, GL_FALSE, 0, 0);

        GLint colAttrib = glGetAttribLocation( shaderProgram, "color" );
        glEnableVertexAttribArray(colAttrib);
        glVertexAttribPointer(colAttrib, 4, GL_INT, GL_FALSE, 0, 0);

        GLint uniform_tex = glGetUniformLocation(shaderProgram, "tex");

        GLuint tex;
        glActiveTexture(GL_TEXTURE0);
        glGenTextures(1, &tex);
        glBindTexture(GL_TEXTURE_2D, tex);
        glUniform1i(uniform_tex, 0);

        GLuint uniform_color = glGetUniformLocation(shaderProgram, "color");

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

        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

        // Actual font rendering
        FT_Library ft;

        if(FT_Init_FreeType(&ft))
                debug.Print("Could not initiate freetype library.");

        FT_Face face;
        if(FT_New_Face(ft, fontName, 0, &face))
        {
                debug.Print("Could not load font: ");
                debug.Print(fontName);
        }

        FT_Set_Pixel_Sizes(face, sizex, sizey);

        FT_GlyphSlot glyph = face->glyph;

        const char *p;

        for(p = text; *p; p++) {
                if(FT_Load_Char(face, *p, FT_LOAD_RENDER))
                        continue;

                glTexImage2D(
                  GL_TEXTURE_2D,
                  0,
                  GL_ALPHA,
                  glyph->bitmap.width,
                  glyph->bitmap.rows,
                  0,
                  GL_ALPHA,
                  GL_UNSIGNED_BYTE,
                  glyph->bitmap.buffer
                );

                float x2 = posx + glyph->bitmap_left * sizex;
                float y2 = -posy - glyph->bitmap_top * sizey;
                float w = glyph->bitmap.width * sizex;
                float h = glyph->bitmap.rows * sizey;

                GLfloat box[4][4] = {
                        {x2,     -y2    , 0, 0},
                        {x2 + w, -y2    , 1, 0},
                        {x2,     -y2 - h, 0, 1},
                        {x2 + w, -y2 - h, 1, 1},
                };

                glBufferData(GL_ARRAY_BUFFER, sizeof box, box, GL_DYNAMIC_DRAW);
                glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

                posx += (glyph->advance.x >> 6) * sizex;
                posy += (glyph->advance.y >> 6) * sizey;

                GLfloat color[4] = {r, g, b, 1};
                glUniform4fv(uniform_color, 1, color);
  }
}
4

2 に答える 2

0

問題は、FT_Set_Pixel_Sizes を sizex と sizey で設定し、テキストのボックスを作成するときに sizex と sizey を使用してボックスをスケーリングすることです。

したがって、sizex と sizey を 48 に設定すると、テキスト ボックスを 48 倍にスケーリングすることになり、sizex と sizey を 1 に設定すると、フォントのピクセル サイズが非常に小さくなります。

修正するには: サイズまたは高さと幅のパラメータを追加して関数を作成し、FT_Set_Pixel_Size に使用します。

元。

void Create(char* Text, char* fontName, int posx, int posy, int r, int g, int b, int sizex, int sizey, int height, int width){
...
FT_Set_Pixel_Size(face, width, height); //Not sizex and sizey because thats what you are using to scale the text box
}
于 2014-08-01T12:31:37.280 に答える
0

私は私のコメントを拡張しようとします。

while( running )ループで、 を呼び出しますtext.Create("The quick brown fox jumps over the lazy dog", "arial.ttf", 300, 400, 1, 1, 1, 2/600, 2/800);。この関数の詳細を見ると、単純に新しいテキスト エントリを作成するだけでなく、 を初期化FreeTypeしたり、 をロードしたりしfontsます...

FreeTypeゲーム/シミュレーションを1 回だけ初期化text.Createし、ゲーム/シミュレーション全体で持続するオブジェクトを返す必要があります。

このwhile(running)部分では、オブジェクトのメソッドを呼び出してRender、画面にレンダリングする必要があります。

于 2012-11-23T03:02:48.983 に答える