#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
вызовы andglBindVertexArray
в точку после вызова toglfwMakeContextCurrent
(и, возможно, также послеglewInit
), посколькуglfwCreateWindow
не задает текущий контекст OpenGL.2. @G.M. fhat работает, спасибо. Где я мог бы прочитать больше о таком поведении?
3. Боюсь, это всего лишь базовый материал OpenGL, поэтому просто продолжайте читать учебные пособия 🙂 Сказав это, учебник, на который вы ссылаетесь, кажется немного «разбросанным» из-за отсутствия полных примеров кода. learnopengl.com это сайт, который многие люди рекомендуют. Не забывая, конечно, о базовой спецификации .
4. Это не имеет ничего общего с OpenGL напрямую. Ваша программа вылетает при попытке разыменования нулевого указателя.
5. @G.M. спасибо, количество объяснений на этом сайте значительно выше