代码之家  ›  专栏  ›  技术社区  ›  Cyclone6664

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

  •  1
  • Cyclone6664  · 技术社区  · 1 年前

    嗨,我正在尝试使用c++、高兴和glfw用OpenGL编写一个程序,但我遇到了一个无法解决的问题。

    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 变量会改变值,我不知道它是如何或为什么这样做的。我还制作了一张gif来更好地显示问题:

    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一起使用。

    1 回复  |  直到 1 年前
        1
  •  2
  •   user7860670    1 年前

    如果 N_EBOS 是15,大于1,则的第二个自变量 glGenBuffers 必须指向至少具有此大小的数组的第一项,否则将导致缓冲区溢出。

    ::std::array<GLuint, N_EBOS> ebos{};
    ::glGenBuffers(ebos.size(), ebos.data());
    

    别忘了打电话 ::glGetError 以确定调用是否成功。