Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:为什么我不能访问另一帧中的数据?_C++_Winapi_Opengl_Graphics - Fatal编程技术网

C++ OpenGL:为什么我不能访问另一帧中的数据?

C++ OpenGL:为什么我不能访问另一帧中的数据?,c++,winapi,opengl,graphics,C++,Winapi,Opengl,Graphics,我使用GLEW创建OpenGL上下文,使用“标准”win32创建窗口 如果我在每一帧设置VBO和VAO(两个全局变量),那么我的几何体将正确渲染。程序和位置都是全局的,并在循环发生之前设置 while (!done) { PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE); if (msg.message == WM_QUIT) done = true; e

我使用GLEW创建OpenGL上下文,使用“标准”win32创建窗口

如果我在每一帧设置VBO和VAO(两个全局变量),那么我的几何体将正确渲染。程序和位置都是全局的,并在循环发生之前设置

    while (!done)
    {
        PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

        if (msg.message == WM_QUIT)
            done = true;
        else
        {
            glClear(GL_COLOR_BUFFER_BIT);

            glGenVertexArrays(1, &vao);
            glGenBuffers(1, &vbo);

            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);

            glBindVertexArray(vao);

            glVertexAttribBinding(0, vao);
            glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(glm::vec4));
            glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);
            glEnableVertexAttribArray(0);

            glUseProgram(program);

            glDrawArrays(GL_TRIANGLES, 0, 3);

            glBindVertexArray(0);
            glUseProgram(0);

            SwapBuffers(g_HDC);

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;
}
但是,我希望在渲染块外部初始化VBO/VAO,而不是每帧绑定VAO。这是我目前拥有的,但我仍然无法让它工作。渲染的只是一个黑屏

    glGenVertexArrays(1, &vao);
    glGenBuffers(1, &vbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);

    glBindVertexArray(vao);

    glVertexAttribBinding(0, vao);
    glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(glm::vec4));
    glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);
    glEnableVertexAttribArray(0);

    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    while (!done)
    {
        PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

        if (msg.message == WM_QUIT)
            done = true;
        else
        {
            glClear(GL_COLOR_BUFFER_BIT);

            glUseProgram(program);
            glBindVertexArray(vao);

            glDrawArrays(GL_TRIANGLES, 0, 3);

            glBindVertexArray(0);
            glUseProgram(0);

            SwapBuffers(g_HDC);

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return msg.wParam;
}
我的印象是,一旦设置了缓冲区数据,它将是永久的,直到显式删除?我是不是遗漏了什么

非常感谢所有帮助。

将缓冲区绑定到顶点缓冲区绑定点,但不绑定到属性索引。绑定点和属性索引之间的关联通过以下方式建立:

glVertexAttribBinding(0,vao)

glVertexAttribBinding(0,0);
DSA版本分别为:

glvertexarrayattribbbinding(vao,0,0);
将缓冲区绑定到顶点缓冲区绑定点,但不绑定到属性索引。绑定点和属性索引之间的关联通过以下方式建立:

glVertexAttribBinding(0,vao)

glVertexAttribBinding(0,0);
DSA版本分别为:

glvertexarrayattribbbinding(vao,0,0);

谢谢!我明白为什么第一个参数是0,但为什么是第二个?您链接的文档中描述的绑定索引是什么?@ConnorHemingway请阅读。对这个问题的完美回答详细解释了一切。在这里重新做一遍,甚至复制/粘贴都没有意义。谢谢!我明白为什么第一个参数是0,但为什么是第二个?您链接的文档中描述的绑定索引是什么?@ConnorHemingway请阅读。对这个问题的完美回答详细解释了一切。在这里重新做一遍,甚至复制/粘贴都没有意义。