Привет, я пытаюсь написать программу с OpenGL, используя C++, Glad и glfw, но столкнулся с проблемой, которую не могу понять.
main.cpp
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
#define SCR_WIDTH 1280
#define SCR_Height 720
int main() {
GLFWwindow* window = init();
unsigned int VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(N_EBOS, &EBO);
//load vertices etc..
while (!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
// Render stuff...
glfwPollEvents();
}
glfwTerminate();
return 0;
}
По сути, если я удалю glGenBuffers(N_EBOS, &EBO);, все работает нормально, но когда я добавляю эту строку, а N_EBOS равен 15 или более, программа выдает ошибку на строке glfwWindowShouldClose(window). После использования отладчика я обнаружил, что после запуска glGenbuffers(N_EBOS, &EBO); переменная window меняет значение, и я не могу понять, как и почему она это делает. Я также сделал гифку, чтобы лучше показать проблему:
Для большего контекста это функция init();:
GLFWwindow* init() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Thing", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
exit(1);
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
exit(1);
}
glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);
return window;
}
Так в чем же может быть причина и какое может быть решение? Я пробовал искать в Интернете, но безрезультатно.
Я думал, что это может быть своего рода переполнение буфера, но не могу понять, где это могло произойти. Также, если это поможет, я использую Clion с CMake, CPP 23, OpenGL 3.3 и Arch Linux.





Если N_EBOS равно 15, то есть больше 1, то второй аргумент glGenBuffers должен указывать на первый элемент массива хотя бы этого размера, иначе вы получите переполнение буфера.
::std::array<GLuint, N_EBOS> ebos{};
::glGenBuffers(ebos.size(), ebos.data());
И не забудьте вызвать ::glGetError, чтобы узнать, удался ли звонок.
Спасибо, чувак, даже не знаю, почему я об этом не подумал. Теперь, когда я знаю, это кажется очевидным, лол