【问题标题】:OpenGL: Why can I not access the data in another frame? [duplicate]OpenGL:为什么我不能访问另一帧中的数据? [复制]
【发布时间】:2021-02-21 21:07:53
【问题描述】:

我正在使用 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;
}

我的印象是,一旦设置了缓冲区数据,在明确删除之前它是永久的?我在这里遗漏了什么吗?

非常感谢所有帮助。

【问题讨论】:

    标签: c++ winapi opengl graphics


    【解决方案1】:

    glVertexArrayVertexBuffer 将缓冲区绑定到顶点缓冲区绑定点,但不绑定到属性索引。绑定点与属性索引的关联是由glVertexAttribBinding建立的:

    glVertexAttribBinding(0, vao);

    glVertexAttribBinding(0, 0);
    

    分别是DSA版本:

    glVertexArrayAttribBinding(vao, 0, 0);
    

    【讨论】:

    • 谢谢!我明白为什么第一个参数是 0 但为什么是第二个?您链接的文档中描述的 bindingIndex 是什么?
    • @ConnorHemingway 请阅读glVertexAttribPointer and glVertexAttribFormat: What's the difference?。这个问题的优秀答案详细解释了所有内容。在这里重新做一遍,甚至复制/粘贴它是没有意义的。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2014-12-15
    • 2017-02-28
    • 1970-01-01
    • 2016-01-19
    • 2016-11-25
    相关资源
    最近更新 更多