首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为定制结构配置VBO和VBO

如何为定制结构配置VBO和VBO
EN

Stack Overflow用户
提问于 2020-01-28 09:50:33
回答 1查看 59关注 0票数 1

我正试着建一个酒吧。

首先,我宣布一个结构

代码语言:javascript
复制
struct VertexFormat
    {
        glm::vec3 positions;
        glm::vec3 normal;
        glm::vec2 texCoord;
        VertexFormat(glm::vec3 pos, glm::vec3 norm, glm::vec2 coord) : positions(pos), normal(norm), texCoord(coord)
        {   }
    };

和我配置的VAO和VBO相比

代码语言:javascript
复制
    glBindVertexArray(m_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
    glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(VertexFormat), &data[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size(), &indices[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)(6 * sizeof(float)));
    glBindVertexArray(0);

当我发出绘图命令时,不会绘制任何东西。

代码语言:javascript
复制
 glBindVertexArray(m_VAO);
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

我的问题是,我是否正确地定义了缓冲区中数据的偏移量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-28 09:59:10

此代码有几个问题:

首先,上传到EBO的数据量是错误的。数据的大小必须以字节为单位。假设indices包含无符号整数,代码应该是:

代码语言:javascript
复制
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);

然后,stride描述缓冲区中两个连续顶点之间的偏移量,而不是数据的总大小。在您的示例中,每个顶点在前一个顶点之后启动sizeof(VertexFormat)

正确的代码应该是:

代码语言:javascript
复制
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)(6 * sizeof(float)));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59946037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档