Объявление переменной приводит к закрытию окна OpenGL

#c #opengl

#c #opengl

Вопрос:

Я просто следую руководству по OpenGL для начинающих и столкнулся с довольно странной проблемой: когда я объявляю a GLuint vertexArrayId и пытаюсь сгенерировать и привязать указанный идентификатор, главное окно (просто черное окно) больше не остается открытым. Мой код:

 #include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <cstdio>

const int WINDOW_HEIGHT = 600;
const int WINDOW_LENGTH = 800;

int main(int argc, char *args[])
{
    if (!glfwInit())
    {
        std::puts("Could not initialise GLFW");
        return -1;
    }

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

    GLFWwindow *window;
    window = glfwCreateWindow(WINDOW_LENGTH, WINDOW_HEIGHT, "Window", nullptr, nullptr);

//  GLuint vertexArrayId;
//  glGenVertexArrays(1, amp;vertexArrayId);
//  glBindVertexArray(vertexArrayId);

    if (nullptr == window)
    {
        std::puts("Could not initialize window");
        glfwTerminate();
    }

    glfwMakeContextCurrent(window);

    if(glewInit() != GLEW_OK){
        std::puts("Could not initialize GLEW");
        return -1;
    }

    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

    while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS and glfwWindowShouldClose(window) == 0){

        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    return 0;
}
 

Если я оставлю код таким образом, откроется черное окно и останется открытым до тех пор, пока я не нажму клавишу ESC. Если бы я раскомментировал этот раздел, окно больше не оставалось открытым и закрывалось, как если бы while цикла не было. Из-за этого я не могу следовать руководству и проверять дополнительные функции, которые я пытаюсь реализовать.

Что я делаю не так?

Комментарии:

1. Попробуйте переместить glGenVertexArrays вызовы and glBindVertexArray в точку после вызова to glfwMakeContextCurrent (и, возможно, также после glewInit ), поскольку glfwCreateWindow не задает текущий контекст OpenGL.

2. @G.M. fhat работает, спасибо. Где я мог бы прочитать больше о таком поведении?

3. Боюсь, это всего лишь базовый материал OpenGL, поэтому просто продолжайте читать учебные пособия 🙂 Сказав это, учебник, на который вы ссылаетесь, кажется немного «разбросанным» из-за отсутствия полных примеров кода. learnopengl.com это сайт, который многие люди рекомендуют. Не забывая, конечно, о базовой спецификации .

4. Это не имеет ничего общего с OpenGL напрямую. Ваша программа вылетает при попытке разыменования нулевого указателя.

5. @G.M. спасибо, количество объяснений на этом сайте значительно выше