【发布时间】:2018-01-29 16:16:58
【问题描述】:
我在 OS X 上使用 OpenGL Core 配置文件。据我了解,在 OS X 上尚不支持 DebugMessageCallbacks,但在 4.3 下的开放 GL 版本中,我使用的是 4.1。所以我必须使用更基本的使用 glGetError 的方法。
这是我记录输出的方式:
void glCheckError_(const char *p_file, int p_line) {
GLenum error_code;
while ((error_code = glGetError()) != GL_NO_ERROR)
{
std::string error;
switch (error_code)
{
case GL_INVALID_ENUM: error = "INVALID_ENUM"; break;
case GL_INVALID_VALUE: error = "INVALID_VALUE"; break;
case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break;
case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break;
case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break;
case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break;
case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break;
}
std::cout << error << " | " << p_file << " (" << p_line << ")" << std::endl;
}
}
我为此使用了一个快捷宏:
#define glCheckError() glCheckError_(__FILE__, __LINE__)
我的 openGL 应用程序编译、运行,但没有渲染。我几乎在每个 openGL 调用下都抛出了 glCheckError(),并且在 glfw 初始化之后我只得到 1 个错误,那就是:
INVALID_ENUM | /Users/ddodds/CLionProjects/salem-gdk/salem/system/GameLoop.cpp (139)
据我了解,这只是一些初始化后发生的事情,可以忽略不计。但是,以防万一我错了,这就是发生此错误的地方:
在游戏循环开始迭代之前调用,在 glfw/glad 初始化之后:
void GameLoop::Run()
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glEnable(GL_BLEND);
glCheckError(); // This is the error
没有任何关于为什么我的应用程序没有呈现的 opengl 错误,我尝试调试应用程序的下一步是什么?解决此类问题的最佳方法是什么。我对 OpenGl 和它的工具相当陌生。
【问题讨论】:
-
在 OGL 中,每个错误都很重要,不要忽略它们。
-
在 OSX 上有用:apitrace 和 Xcode tools