2017-12-29 72 views
1

OpenGL 4.4がインストールされ、対応する4.4コアGLADビルドとGLFWバージョン3.2(Visual Studio 2015で編集中)があります。私はhttps://learnopengl.com/#!In-Practice/Debuggingで説明するようにコールバック関数を使用しています:glDebugMessageCallbackが原因でアクセス違反が発生しました(GLFW + GLAD)

void APIENTRY glDebugOutput(GLenum source, GLenum type, GLuint id, GLenum severity, 
    GLsizei length, const GLchar *message, const void *userParam); 

私は、次の機能があります。

GLFWwindow* init(int width, int height, const char* header) { 
    GLFWwindow* window; 

    glfwInit(); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); 

    window = glfwCreateWindow(width, height, header, NULL, NULL); 
    if (window == NULL) { 
     glfwTerminate(); 
     throw std::runtime_error("Failed to create GLFW window."); 
    } 
    glfwMakeContextCurrent(window); 
    glfwSetFramebufferSizeCallback(window, resizeCallback); 

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) 
    { 
     glfwTerminate(); 
     throw std::runtime_error("Failed to initialize GLAD"); 
    } 

    GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags); 
    if (flags & GL_CONTEXT_FLAG_DEBUG_BIT) 
    { 
     glEnable(GL_DEBUG_OUTPUT); 
     glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); 
     glDebugMessageCallback(glDebugOutput, nullptr); // segfault on this line 
     glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); 
    } 

    return window; 
} 

を私は無駄に、GLAD再インストールし、コールバックにAPIENTRYを変更しようとしました。私は完全に迷っています。

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

はGL 3.3コアである:あなたがここに要求しているもの

+6

GL 4.4を使用している場合、なぜGL 3.3のみをロードしていますか? –

+0

あなたの 'glDebugOutput'コールバックには何がありますか? –

+0

@NicolBolasすべてのもののうち...うまくいけば、ありがとう! –

答えて

2

relevantextension仕様にAccroding:

  • 要求されたバージョンの要求されたプロファイル:バージョン3.2以上が要求されている場合

    、返されるコンテキストは 次のバージョンのいずれかを実施することができます。

  • の機能がそれ以降のバージョンとプロファイルから削除されていない限り、それ以降のバージョンの要求されたプロファイルです。

あなたには、いくつかの状況> = 3.3を得ることができます。あなたがGL 4.4で実行可能なOpenGL実装を持っているという事実は、あなたが4.4コンテキストを取得することを保証しません。あなたが得るかもしれない - と多くのドライバーは最近、実際にそれを行う - 正確にあなたが求めているバージョン。

あなたはGLADからコードに見ると、あなたが見つける:

static void load_GL_VERSION_4_3(GLADloadproc load) { 
     if(!GLAD_GL_VERSION_4_3) return; 
     [...] 
     glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback"); 
     [...] 
} 

だから、GLADあなたのコンテキストのGLバージョンは、少なくともでない場合、その関数ポインタをロードするだろうもない試み 4.3。結果として、あなたが> = 4.3コンテキストにいることを確認せずにこの関数を呼び出すと、未定義の動作に過ぎず、クラッシュする可能性が非常に高いです。

関連する問題