嗨,我正在尝试使用 c++、glad 和 glfw 编写一个 OpenGL 程序,但我遇到了一个无法解决的问题。
主.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
变量会更改值,但我无法弄清楚它是如何或为什么这样做的。我还制作了一个 gif 来更好地展示问题:
为了了解更多上下文,这是
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 或更大,则 glGenBuffers
的第二个参数必须指向至少此大小的数组的第一项,否则将出现缓冲区溢出。
::std::array<GLuint, N_EBOS> ebos{};
::glGenBuffers(ebos.size(), ebos.data());