2017-12-29 35 views
1

OpenGL 버전 4.4, 해당 4.4 코어 GLAD 빌드 및 GLFW 버전 3.2 (Visual Studio 2015에서 편집) 설치되어 있습니다.glDebugMessageCallback 인해 액세스 위반 (GLFW + GLAD)

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

나는 다음과 같은 기능이있다 : 나는 https://learnopengl.com/#!In-Practice/Debugging에 설명 된대로 콜백 함수를 사용하고

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을 변경. 나는 완전히 잃어 버렸어, 어떤 제안?

+6

GL 4.4를 사용하는 경우 GL 3.3 만로드하는 이유는 무엇입니까? –

+0

'glDebugOutput' 콜백에 무엇이 있습니까? –

+0

@NicolBolas 모든 것들 중 ... 잘 작동, 고마워요! –

답변

2

하면 여기에 요청하는 무엇 :

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

는 GL 3.3 핵심입니다. 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"); 
     [...] 
} 

다행됩니다 컨텍스트의 GL 버전 는 적어도 경우 그 함수 포인터를로드 할 수조차 시도 4.3. 결과적으로> = 4.3 컨텍스트에 있는지 확인하지 않고이 함수를 호출하면 정의되지 않은 동작이되고 충돌이 발생할 가능성이 큽니다.