2017-08-22 10 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の使用をやめた理由の1つです。最近ではGLADを使ってエクステンションのWranglingを行っていますが、明らかに自分のOpenGLウィンドウを作成してプレイする必要があります。 – Robinson

+0

@BDLなぜ 'glewInit()'がこのエラーを引き起こすと思いますか?そして、 'glewInit()'の前にデバッグ出力を設定することはできません。なぜなら、初期化されていない関数ポインタを使用するためにクラッシュするからです。 –

答えて

1

コアコンテキストでbeeingを使用すると、GLEW 1.xにいくつかの問題があります(その理由は、glewExperimental=trueが必要な理由です)。 glewInitは、拡張機能を読み込む際に常にOpenGLエラーを生成します。コールバックの初期化は、エラーが発生した時点以降に発生するため、デバッグコールバックではこのエラーは発生しません。

ここでは、チキンエッグの問題があります.GLEWを初期化する前にデバッグコールバックを設定することはできませんが、デバッグ出力を取得する場所です。 glewInitの直後にglGetError()と呼んで、どこから来ているのかわかる1つのエラーを取り除くことをお勧めします。

関連する問題