2017-08-22 139 views
0

我在寫遊戲。大部分時間我都使用ArchLinux,但我最近試圖在Ubuntu 16.04上運行我的遊戲。在Ubuntu 16.04上有一個奇怪的錯誤:。找到導致錯誤的原因太困難了,所以我想看看opengl的調試輸出,但我沒有看到它。我注意到着色器驗證過程中的一件事 - 驗證似乎是不成功的,但日誌爲空:Opengl 4調試輸出不起作用

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的調試輸出。而且,如果可能的話,作爲一個額外的問題,爲什麼在沒有日誌的情況下着色器驗證失敗?

+2

我想因爲'glewInit()'會導致這個錯誤(因爲它總是這樣),並且在那之後註冊調試輸出。 – BDL

+0

這是我停止使用GLEW的原因之一。這些天我使用GLAD進行擴展爭論,但顯然必須創建我自己的OpenGL窗口。 – Robinson

+0

@BDL爲什麼你認爲'glewInit()'會導致這個錯誤?而且我不能在'glewInit()'之前設置調試輸出,因爲它會因使用未初始化的函數指針而崩潰。 –

回答

1

GLEW 1.x在覈心環境中使用beeing時存在一些問題(這也是爲什麼需要glewExperimental=true)。 glewInit在加載擴展時總會產生OpenGL錯誤。通過調試回調,您不會收到此錯誤,因爲回調的初始化發生在發生錯誤的位置之後。

這裏有一個雞蛋問題:在初始化GLEW之前,您不能設置調試回調,但這是您想從中獲取調試輸出的地方。我建議在glewInit之後立即撥打glGetError()以擺脫您知道來自哪裏的一個錯誤。