Opengl 4调试输出不起作用

时间:2017-08-22 11:05:14

标签: c++ opengl sdl-2 opengl-4

我正在写一个游戏。我大部分时间都使用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的调试输出。并且,如果有可能,作为一个额外的问题,为什么着色器验证在没有日志的情况下失败?

1 个答案:

答案 0 :(得分:1)

GLEW 1.x在核心环境中使用时存在一些问题(这也是为什么需要glewExperimental=true)。 glewInit在加载扩展程序时始终会生成OpenGL错误。您不会通过调试回调获得此错误,因为回调的初始化发生在错误发生的位置之后。

这里有一个鸡蛋问题:你无法在初始化GLEW之前设置调试回调,但那是你想从中获取调试输出的地方。我建议在glGetError()之后立即致电glewInit,以摆脱您知道它来自哪里的错误。