私はゲームを作成中です。私は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のデバッグ出力を見ることができない理由です。さらに可能な場合は、追加の質問として、ログがなくてもシェーダの検証が失敗するのはなぜですか?
'glewInit()'が(常にそうであるように)このエラーを引き起こし、その後にデバッグ出力を登録していると思います。 – BDL
これはGLEWの使用をやめた理由の1つです。最近ではGLADを使ってエクステンションのWranglingを行っていますが、明らかに自分のOpenGLウィンドウを作成してプレイする必要があります。 – Robinson
@BDLなぜ 'glewInit()'がこのエラーを引き起こすと思いますか?そして、 'glewInit()'の前にデバッグ出力を設定することはできません。なぜなら、初期化されていない関数ポインタを使用するためにクラッシュするからです。 –