OpenGL调用glGenBuffers创建多EBO后程序段错误,疑似变量被意外修改
OpenGL调用glGenBuffers创建多EBO后程序段错误,疑似变量被意外修改
兄弟,我一眼就看出问题出在哪了——你调用glGenBuffers的方式不对,导致内存越界把window指针给冲坏了!
咱们仔细看代码:你声明的EBO是单个unsigned int变量,但当你用glGenBuffers(N_EBOS, &EBO)且N_EBOS >=15时,glGenBuffers会尝试往&EBO指向的内存位置开始,连续写入N_EBOS个buffer ID。可你只给了一个变量的空间啊!这就会越界写入栈上的其他内存区域,刚好把旁边的window指针给覆盖成无效值了,后面调用glfwWindowShouldClose(window)的时候自然就段错误了。
解决方法很简单,分两种情况:
情况1:你确实需要多个EBO
那得先准备一个能装下N_EBOS个ID的数组,比如:
// 如果N_EBOS是编译期常量,用静态数组 unsigned int EBOs[N_EBOS]; // 或者用动态分配(记得最后delete[]释放) unsigned int* EBOs = new unsigned int[N_EBOS];
然后调用glGenBuffers的时候传数组的地址:
glGenBuffers(N_EBOS, EBOs);
情况2:你其实只需要一个EBO
那直接把第一个参数改成1就行,不用搞什么N_EBOS:
glGenBuffers(1, &EBO);
修改后你的代码片段大概是这样(以多个EBO为例):
int main() { GLFWwindow* window = init(); unsigned int VAO, VBO; // 定义数组存储多个EBO ID unsigned int EBOs[N_EBOS]; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(N_EBOS, EBOs); // 这里传数组地址 //load vertices etc.. while (!glfwWindowShouldClose(window)) { glfwSwapBuffers(window); // Render stuff... glfwPollEvents(); } // 如果用了动态数组,记得释放 // delete[] EBOs; glfwTerminate(); return 0; }
本质就是栈内存越界导致的变量污染,这种问题有时候很隐蔽,但只要记住OpenGL这类底层API的参数要求——需要多个对象ID时必须传足够大的数组,就不会踩坑啦!
备注:内容来源于stack exchange,提问作者Cyclone6664
相关产品推荐
相关产品推荐

