Opengl 4 调试输出不起作用
Opengl 4 debug output does not work
我在写一个游戏。我大部分时间都在使用 ArchLinux,但我最近尝试在 Ubuntu 16.04 上运行我的游戏。在 Ubuntu 16.04 上有一个奇怪的错误:1280。很难找到导致错误的原因,所以我想看看 opengl 的调试输出,但我也没有看到它。我在着色器验证期间注意到一件事 - 验证似乎不成功,但日志为空:
GLint status;
glValidateProgram(program_);
glGetProgramiv(program_, GL_VALIDATE_STATUS, &status);
if (status == GL_TRUE) {
return;
}
// Store log and return false
int length = 0;
glGetProgramiv(program_, GL_INFO_LOG_LENGTH, &length);
if (length > 0) {
GLchar infoLog[512];
glGetProgramInfoLog(program_, 512, nullptr, infoLog);
throw std::runtime_error(std::string("Program failed to validate:") + infoLog);
} else {
throw std::runtime_error(std::string("Program failed to validate. Unknown error"));
}
这给了我Unknown error
.同样看不到 opengl 的调试输出,但是,用户消息在那里成功写入。这是代码:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
int contextFlags = 0;
SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &contextFlags);
contextFlags |= SDL_GL_CONTEXT_DEBUG_FLAG;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, contextFlags);
sdlWindow_ = SDL_CreateWindow(title.c_str(),
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
0,
0,
SDL_WINDOW_OPENGL
| SDL_WINDOW_SHOWN
| SDL_WINDOW_FULLSCREEN_DESKTOP
| SDL_WINDOW_INPUT_GRABBED);
if (!sdlWindow_) {
throw std::runtime_error("Unable to create window");
}
SDL_Log("Window created");
glContext_ = SDL_GL_CreateContext(sdlWindow_);
if (!glContext_) {
throw std::runtime_error("Failed to init OpenGL");
}
SDL_Log("GL context created");
{
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (err != GLEW_OK) {
throw std::runtime_error(std::string("GLEW Error: ") + reinterpret_cast<const char*>(glewGetErrorString(err)));
}
}
if (glDebugMessageCallbackARB != nullptr) {
SDL_Log("GL debug is available.n");
// Enable the debug callback
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(_openglDebugCallbackFunction, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
GL_DEBUG_SEVERITY_NOTIFICATION, -1 , "Started debugging");
} else {
SDL_Log("GL debug is not available.n");
}
所以这里的主要问题是为什么我看不到 opengl 的调试输出。而且,如果可能的话,作为一个附加问题,为什么着色器验证在没有日志的情况下失败?
GLEW 1.x 在核心上下文中使用时存在一些问题(这也是需要glewExperimental=true
的原因(。 加载扩展时,glewInit
始终生成 OpenGL 错误。您不会通过调试回调收到此错误,因为回调的初始化发生在发生错误的点之后。
你在这里有一个先有鸡还是先有蛋的问题:在初始化 GLEW 之前,您无法设置调试回调,但这是您想要从中获取调试输出的地方。我建议在glewInit
后立即致电glGetError()
以摆脱您知道它来自何处的一个错误。
相关文章:
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- Opengl 4 调试输出不起作用
- bcdedit 文件输出不起作用,但其他命令可以
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 类中的重载函数(Students())是输出输入的信息,但它不起作用
- 来自外部TXT文件的C 排行榜输出不起作用
- C++流输出不起作用
- C++输出流到文件不起作用
- 获得程序输出(无错误),但程序.exe在使用 graphics.h 时不起作用
- Rapidjson 输出到字符串不起作用
- 函数 system() 中的输出重定向似乎不起作用
- 为什么第一个程序不起作用,而第二个程序有效?其次,为什么输出是它给出的
- G++ 转储的程序集输出不起作用
- 使用输出迭代器不起作用的通用函数示例
- 重定向子进程的输入和输出不起作用
- 为什么我的输出流seg出错,而我的虚拟析构函数不起作用,但当我杀死虚拟的时候,它起作用了
- DLL 输出到 stderr 在从父级重定向时不起作用
- 我在 MFC 中使用 TRACE,但它不起作用(没有输出).为什么
- 在Visual Studio中使用GLUT库,没有错误,但输出控制台不起作用
- 在VS2010项目中更改输出目录不起作用