Исключение, выданное в 0x00000000 в Project0_opengl.exe: 0xC0000005: расположение выполнения нарушения прав доступа 0x00000000 - PullRequest
1 голос
/ 24 марта 2019

Я пишу правильный код, но компилятор выдает ошибку. Ошибка говорит о том, что ошибка на glGenBuffers, но я скопировал ее с официального сайта. Где моя ошибка?

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <stdio.h>

int main(void)
{
    GLFWwindow* window;
    glewExperimental = GL_TRUE;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    float pos[6] = {
        -0.5f, -0.5f,
         0.0f,  0.5f,
         0.5f, -0.5f
    };

    GLuint buf;
    glGenBuffers(1, &buf);
    glBindBuffer(GL_ARRAY_BUFFER, buf);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);

    if (glewInit() != GLEW_OK)
        printf("Error\n");

    printf("%s", glGetString(GL_VERSION));

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

1 Ответ

1 голос
/ 24 марта 2019

glewInit() должен вызываться после того, как контекст OpenGL становится текущим, после glfwMakeContextCurrent.
Но он должен вызываться перед любой инструкцией OpenGL.См. Также Инициализация GLEW :

// [...]

/* Make the window's context current */
glfwMakeContextCurrent(window);

glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
    printf("Error\n");

float pos[6] = {
    -0.5f, -0.5f,
     0.0f,  0.5f,
     0.5f, -0.5f
};

GLuint buf;
glGenBuffers(1, &buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);

// [...]

Обратите внимание, что инструкции, подобные glGenBuffers, являются указателями функций.Эти указатели инициализируются на NULL.glewInit() присваивает адрес функции этим указателям.
Когда вы пытаетесь вызвать функцию перед инициализацией, это вызывает:

Нарушение доступа к месту выполнения 0x00000000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...