Скомпилируйте с MinGW и установите FTGL lib для рендеринга текста в OpenGL - PullRequest
2 голосов
/ 19 февраля 2012

Контекст

Я делаю игровой движок, используя SDL и OpenGL. Я пытаюсь найти лучший способ вывода текста на экран с причудливым шрифтом True Type, и я наткнулся на FTGL. (Если у вас есть лучшее / простое решение, не стесняйтесь поделиться им.)

Компиляция FTGL

Для работы требуется FreeType2, поэтому я его получил, скомпилировал (используя Code :: Block), а затем скомпилировал библиотеку FTGL, используя Code :: Block.

Я использую Eclipse Indigo с плагином CDT. Я не уверен, какую библиотеку взять, так как есть файлы .lib и .dll. Я пробовал оба, но это, похоже, не меняет мою проблему, которая в данный момент находится в этой строке:

FTfont* m_Font = new FTTextureFont(filename.c_str());

Ошибка:

The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'

Это не изменится, если я использую другой подкласс FTfont, например Конструктор FTPixmapFont.

Вот флаги компоновщика, которые я пробовал:

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -lfreetype234_D -lopengl32 -lglu32

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -llibfreetype -lopengl32 -lglu32

Я использую затмение с MinGW.

Я скопировал и вставил

  • папка src/FTGL и
  • содержимое папки Include библиотеки freetype

в папку include каталога MinGW.

Оба файла freetype2 (есть freetype.lib, freetype248_D.lib и freetype-bcc.lib, которые не обязательно связаны в свойствах проекта) и ftgl (ftgl.dll, ftgl_D.lib, ftgl_static_D.lib) lib файлы в соответствующая папка lib каталога MinGW.

Если я нажму на строку с ошибкой и использую опцию Открытое объявление, eclipse приведет меня к заголовочному файлу FTTextureFont, в котором определено FTTextureFont(char const*) и определена функция MakeGlyph.

Полный код можно найти на странице проекта GetRandomGame , если вы хотите увидеть больше, или в качестве справки.

Вот версия компилятора

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.1/configure --enable-languages=c,c++,fortran,objc,ob
j-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp -
-disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runti
me-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.1 (GCC)

EDIT

Подобный вопрос: FTGL неопределенные ссылки всегда были? , но ответ на этот вопрос не решает мою проблему, я все еще получаю эти две ошибки.


РЕДАКТИРОВАТЬ 2

Я компилировал с использованием MSVC, когда я впервые попытался использовать FTGL, и у меня было две ошибки.

Наконец, я использовал code :: block для импорта проекта MSVC, поставляемого с обеими библиотеками. Одна из двух ошибок была решена! Но я все еще получил это:

The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'

РЕДАКТИРОВАТЬ 3

Я пытался скомпилировать FTGL 2.1.2 с помощью freetype 2.3.4, и это не решило мою проблему. Я пробовал FTGL 2.1.3 RC5 с freetype 2.3.4, тоже самое. Просто чтобы быть уверенным, я также пробовал freetype 2.3.5 и 2.4.8 (первый раз уже был 2.4.8).

Я пытался переместить код MakeGlyph в заголовочный файл, но это не решило проблему.

Вот несколько полезных ссылок, которые я нашел, но они еще не решили проблему.


РЕДАКТИРОВАТЬ 4

Когда я убираю флаг компоновщика ftgl, компилятор жалуется на это:

undefined reference to FTPixmapFont::FTPixmapFont(char const*)'
collect2: ld returned 1 exit status
Build error occurred, build is stopped

И я все еще получаю чисто виртуальный метод MakeGlyph Ошибка.

С флагом компоновщика ftgl единственная ошибка, которую я получаю, это "должен реализовать унаследованный метод Pure Virtual MakeGlyph" . Компилятор строит проект нормально (но вылетает при запуске):

-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lfreetype -lftgl -lopengl32 -lglu32
Build complete for project GetRandomGame

Так что я думаю, что библиотека FTGL не скомпилирована правильно, поскольку в ней должен быть FTPixmapFont.cpp, определяющий чисто виртуальный метод MakeGlyph. Я в новинку со всеми этими библиотеками в c ++ и, возможно, я делаю что-то не так, собирая библиотеку.


РЕДАКТИРОВАТЬ 5

Я прочитал и увидел в примере, что мне нужен файл config.h, поэтому я добавил правильно настроенный файл config.h, который поставляется с FTGL.

Затем я нашел следующий код в примере, предоставленном в каталоге ftgl, и добавил его в свой класс Font.

class FTHaloFont : public FTFont
{
    public:
        FTHaloFont(char const *fontFilePath) : FTFont(fontFilePath) {}

    protected:
        virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot)
        {
            return new FTHaloGlyph(slot);
        }
};

Даже если я определю MakeGlyph там, Eclipse жалуется на неосуществленный чисто виртуальный метод FTFont::MakeGlyph.


РЕДАКТИРОВАТЬ 6

Я попытался отладить из командной строки с помощью gdb, и он говорит мне, что freetype6.dll не может быть найден.Я сейчас пытаюсь найти решение.

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Вы используете неправильный класс.

Правильный класс для использования - FTGLPixmapFont.

#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <common/timer.h>
#include <common/keyboard.h>
#include <FTGL/FTGL.h>
#include <FTGL/FTGLPixmapFont.h>
#include <wchar.h>
#include <math.h>

using Keyboard::keyPressed;

static Timer timer;
static int scrWidth = 640;
static int scrHeight = 480;

int main(int argc, char** argv){
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);

    Keyboard::init();
    timer.reset();
    timer.setMaxFps(100);
    timer.setMinFps(5);

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
        fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
        SDL_Quit();
        return -1;
    }
    glewInit();

    FTGLPixmapFont font("DejaVuSans.ttf");
    font.CharMap(ft_encoding_unicode);
    font.FaceSize(10);
    SDL_ShowCursor(SDL_DISABLE);

    glClearColor(0.2, 0.2, 0.2, 0.2);
    glClearDepth(1.0);

    glEnable(GL_DEPTH_TEST);

    bool running = true;
    while (running){
        SDL_Event event;
        if (SDL_PollEvent(&event)){
            switch(event.type){
                case SDL_QUIT:
                    running = false;
                    break;
            };
        }
        timer.update();
        Keyboard::update();

        if (keyPressed(SDLK_ESCAPE))
            running = false;

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-scrWidth/2.0f, scrWidth/2.0f, scrHeight/2.0f, -scrHeight/2.0f);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        glDisable(GL_DEPTH_TEST);
        wchar_t buf[256];
        swprintf(buf, 256, L"fps: %0.2f", timer.getFps());
        glRasterPos2i(10-scrWidth/2, 20-scrHeight/2);
        font.Render(buf);

        glFlush();
        SDL_GL_SwapBuffers();       
    }   

    SDL_Quit();
    return 0;
}

Также прочитайте учебник .


Судя по моему исходному коду, я использую версию 2.1.2 (поскольку 2.1.3 - это rc5, который является "кандидатом на выпуск", который не"стабилен").Похоже, вы пытаетесь использовать 2.1.3 - RC5.Понизьте до 2.1.2 и попробуйте снова.Кроме того, не забудьте сообщить, какую версию библиотеки вы используете в следующий раз, когда столкнетесь с такой проблемой.

В качестве альтернативы вы можете попытаться исправить FTGL (что является болью, и проект кажется заброшенным).Или вы можете попытаться создать свой собственный рендерер шрифтов на основе freetype2 (что также является болезненным, но может окупиться в долгосрочной перспективе).

1 голос
/ 27 февраля 2012

РЕДАКТИРОВАТЬ 6

Я попытался отладить из командной строки с gdb , и он говорит мне, что freetype6.dll не может быть найден.

Я поместил freetype6.dll помимо своего исполняемого файла в папку debug, и это сработало.

Это вещи, которые замедлили меня или я узнал при поиске решения:

  • Компиляция с тем же компилятором, который я использую
  • Научиться использовать code :: block для импорта проекта Visual Studio
  • Фактически иметь возможность компилировать библиотеки в code :: blockбез каких-либо предупреждений
  • Игра с флагом компоновщика (удалите один и посмотрите, что происходит), чтобы помочь устранить ошибку и найти проблемы
  • Научитесь читать предоставленный пример, чтобы найти необходимые файлы
  • И использовать GDB из командной строки

У меня возникла другая проблема при переименовании некоторого файла проекта, и мне пришлось перенастроить весь проект в Eclipse (буквально удалить все файлы иОформить заказ снова).После этого чисто виртуальная ошибка исчезла!Поэтому я попытался отладить проект и получил эту ошибку:

gdb: unknown target exception 0xc0000135 at 0x7724f52f

Eclipse мне не особо помог, поэтому я попробовал отладчик командной строки и сообщил, что отсутствует freetype6.dll.И это было все!

1 голос
/ 21 февраля 2012

Компилятор сообщает, что метод FTTextureFont::MakeGlyph не был написан.

Вам необходимо:

  1. Наследовать от FTTextureFont и написать MakeGlyphmethod.
  2. Найдите дочерний класс FTTextureFont, который делает то, что вы хотите.

Согласно документам FTGL, любой класс, производный от FTFont (который FTTextureFont имееткак родитель) должен реализовать MakeGlyph.

Я бы искал код в сети, чтобы увидеть, что сделали другие, если бы я был вами.

...