OpenGL 在没有明确告知的情况下修改了变量

问题描述 投票:0回答:1

嗨,我正在尝试使用 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 一起使用。

c++ opengl
1个回答
0
投票

如果

N_EBOS
为 15 或更大,则
glGenBuffers
的第二个参数必须指向至少此大小的数组的第一项,否则将出现缓冲区溢出。

::std::array<GLuint, N_EBOS> ebos{};
::glGenBuffers(ebos.size(), ebos.data());
© www.soinside.com 2019 - 2024. All rights reserved.