Программа на OpenGL & GLFW & GLEW зависает при попытке отрисовки треугольника
Я попытался вывести треугольник на экран с помощью OpenGL и GLEW, и при вызове функции отрисовки программа вроде запускается, но в итоге просто не отвечает... Думаю проблема в функции draw:
VAO.cpp
#include "VAO.h"
#include <GL/gl.h>
VAO::VAO()
{
glGenVertexArrays(1, &VertexArrayID);
}
VAO::~VAO()
{
glDeleteVertexArrays(1, &VertexArrayID);
glDeleteBuffers(buffers.size(), buffers.data());
}
void VAO::addVBO(const std::vector <float>& g_vertex_buffer_data)
{
glGenBuffers(1, &VertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
glBufferData(GL_ARRAY_BUFFER, g_vertex_buffer_data.size() * sizeof(float), g_vertex_buffer_data.data(), GL_STATIC_DRAW);
glVertexAttribPointer(buffers.size(), 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
buffers.push_back(VertexArrayID);
}
void VAO::draw()
{
glBindVertexArray(VertexArrayID);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
}
VAO.h
#pragma once
#include <vector>
#include <GL/gl.h>
class VAO
{
public:
std::vector <GLuint> buffers;
GLuint VertexArrayID;
GLuint VertexBufferID;
VAO();
VAO(const VAO&) = delete;
~VAO();
void addVBO(const std::vector<float> & g_vertex_buffer_data);
void draw();
};
Window.cpp
#include "Window.h"
#include "GL/gl.h"
#include <GLFW/glfw3.h>
#include <stdexcept>
Window::Window(const std::string& title, int width, int height)
{
mWindow = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr);
if (!mWindow)
{
throw std::runtime_error("Couldn't initialize window");
}
setContextCurrent();
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
throw std::runtime_error("Failed to initialize GLEW :(");
}
}
Window::~Window()
{
glfwDestroyWindow(mWindow);
}
void Window::setContextCurrent()
{
glfwMakeContextCurrent(mWindow);
}
void Window::loop()
{
VAO vao;
vao.addVBO({
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
});
while (!glfwWindowShouldClose(mWindow))
{
glClearColor(1, 0, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
vao.draw();
glfwSwapBuffers(mWindow);
glfwPollEvents();
}
}
Ответы (1 шт):
Автор решения: luk_chesnok_xren
→ Ссылка
Видимо, OpenGL и GLEW не любят, когда биндят vertex array в цикле, нужно сделать это один раз в констукторе класса VAO, у меня все заработало)))