我正在使用 OpenGL 构建一个渲染引擎,我想添加一个类似于我的世界的调试覆盖。
对于那些不知道我在说什么的人:
我正在使用 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;
}