首页 > 解决方案 > 分离顶点数据并使用 EBO(s) 将数据链接在一起

问题描述

我对 OpenGL 还是比较陌生,刚刚完成了关于 learnopengl 的“入门”部分,并决定继续制作一个简单的渲染器。我有一个问题。

我一直注意到作者以这种方式将所有顶点数据(位置和纹理)放在一个数组中(pos0,texCoord0,pos1,texCoord1,....)

我觉得当涉及到人们实际所做的事情时,这可能不切实际,因为数据中可能存在一些冗余。所以我的问题是,我可以有 2 个单独的 VBO(一个用于位置,一个用于 texCoords)并使用一个(或两个,我不知道)EBO 在它们之间链接吗?

我已经尝试过拥有 2 个 VBO 和 1 个 EBO。EBO 中索引的结构如下:第一个 x 索引映射到位置,第二个 x 索引映射到 texCoords

这是代码片段:

unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);


unsigned int posVBO;
glGenBuffers(1, &posVBO);
glBindBuffer(GL_ARRAY_BUFFER, posVBO);
glBufferData(GL_ARRAY_BUFFER, 3 * cubeMesh->position_count * sizeof(float), cubeMesh->positions, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);


unsigned int texVBO;
glGenBuffers(1, &texVBO);
glBindBuffer(GL_ARRAY_BUFFER, texVBO);
glBufferData(GL_ARRAY_BUFFER, 2 * cubeMesh->texcoord_count * sizeof(float), cubeMesh->texcoords, GL_STATIC_DRAW);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(2);

unsigned int cubeEBO;
glGenBuffers(1, &cubeEBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeEBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, cnt *2* sizeof(unsigned int), cubeIndices, GL_STATIC_DRAW);

这里的cnt是顶点的大小(通过遍历面计算,如果面有3个顶点cnt+=3,如果有4个顶点cnt+=6)

我正在使用这个库进行模型加载:

glDrawElements(GL_TRIANGLES, cnt, GL_UNSIGNED_INT, 0);

glDrawElements(GL_TRIANGLES, cnt, GL_UNSIGNED_INT, (void*)(cnt * sizeof(GLuint)));

当我这样做时结果并不完全正确,如果您需要更多信息或代码,我会提供。

所以 TLDR:鉴于顶点数据被分隔在一个以上的数组中,是否可以在不创建一个组合两个数据的大数组的情况下绘制一个对象?如何?(即使用多个 VBO 或 EBO)

谢谢

标签: c++copenglgraphicsopengl-3

解决方案


推荐阅读