使用FTGL呈现的文本不可见

时间:2017-08-12 21:14:46

标签: c++ opengl ftgl

我正在使用OpenGL构建渲染引擎,并且我想添加一个类似Minecraft的调试叠加层。

对于那些不知道我在说什么的人:

Minecraft debug overlay

我使用FTGL进行字体渲染,并且我使用了这段代码(我还渲染了一些其他东西(使用GL_TRIANGLE作为基元),他们都做了他们的事情应该做什么

初始设置:

FTGLPixmapFont debugFont (debugFontStr.c_str());

if (debugFont.Error())
{
    std::cerr << "[GameScreen::renderLoop()]\tFailed to load debugging font" << std::endl;
}
else
{
    if(!debugFont.FaceSize(static_cast<unsigned int> (debugFontSize)))
    {
        std::cerr << "[GameScreen::renderLoop()]\tCouldn't set fontSize" << std::endl;
    }
}

主渲染循环(至少相关部分):

glPushAttrib(GL_ALL_ATTRIB_BITS);
glDisable(GL_DEPTH_TEST);

glColor4d(1.0f, 0.0f, 0.0f, 1.0f);
debugFont.Render(this->generateDebugOutput().c_str());

glEnable(GL_DEPTH_TEST);
glPopAttrib();

SDL_GL_SwapWindow(this->sdlWindow);

不幸的是,我的屏幕上看不到FTGL文字。 我正在使用多个纹理单元,如果这是一个相关的因素。

我检查了this->generateDebugOutput()的结果并生成了正常的C ++字符串。 我没有使用GL_LIGHTING,在我完成渲染并重新启用它之前,我已经检查了禁用它的效果,没有效果。

你们中的任何人都可以给我一些关于可能导致这种行为的指示吗?

我使用SDL2创建窗口,这是我的SDL,OpenGL和GLEW的初始化代码:

if (SDL_Init(SDL_INIT_EVERYTHING) >= 0)
{
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, GameScreen::OPENGL_MAJOR_VERSION);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, GameScreen::OPENGL_MINOR_VERSION);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    SDL_DisplayMode dm;
    SDL_GetCurrentDisplayMode(0, &dm);
    this->screenWidth = dm.w;
    this->screenHeight = dm.h;
    this->frameCap = dm.refresh_rate;

    this->sdlWindow = SDL_CreateWindow(GameScreen::DEFAULT_TITLE.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, this->screenWidth, this->screenHeight, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    if (this->sdlWindow != NULL)
    {
        this->openGLContext = SDL_GL_CreateContext(this->sdlWindow);
        if (this->openGLContext != NULL)
        {
            glewExperimental = GL_TRUE;
            GLenum glewError = glewInit();
            if (glewError == GLEW_OK)
            {
                if (SDL_GL_SetSwapInterval(1) < 0)
                {
                    std::cout << "[GameScreen::GameScreen()]\tWARNING: Unable to use VSync: " << SDL_GetError() << std::endl;
                }
            }
            else
            {
                std::cerr << "[GameScreen::GameScreen()]\tFailed to intialize GLEW: " << glewGetErrorString(glewError) << std::endl;
            }
        }
        else
        {
            std::cerr << "[GameScreen::GameScreen()]\tFailed to create OpenGL Context from SDL2 Window: " << SDL_GetError() << std::endl;
        }
    }
    else
    {
        std::cerr << "[GameScreen::GameScreen()]\tFailed to create SDL2 Window: " << SDL_GetError() << std::endl;
    }
}
else
{
    std::cerr << "[GameScreen::GameScreen()]\tFailed to intialize SDL2: " << SDL_GetError() << std::endl;
}

1 个答案:

答案 0 :(得分:0)

对于那些与众不同的人来说,遗憾的是我无法解决这个问题,但是/ r / opengl上的好朋友能够推荐我一些其他的库:

stb_truetype:https://github.com/nothings/stb/blob/master/stb_truetype.h

glText:https://github.com/MrVallentin/glText

可以在这里找到reddit线程:

https:www.reddit.com r opengl comments 6taul5 text_rendered_using_ftgl_not_visible?st = j6c1d8tm&amp; sh = 37fd330b

(我没有足够的代表来上传超过2个链接,所以如果有人可以请用'/'替换网址中的所有空格,那就非常好了)