c++ - 分离顶点数据并使用 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)
谢谢
解决方案
推荐阅读
- php - 如何将multiCURL请求中的GET和POST合二为一?
- swift - 更新 ARKit 的 ARWorldMap 后出现动态库错误
- ruby-on-rails - 「rescue500 => SocketError : getaddrinfo: Name or service not known」无法解决
- javascript - 即使使用不同的电子邮件登录,登录仍会重定向到同一页面
- python - 使用 cron 作业进行烧瓶 API 调用调度
- reactjs - 在 React 打字稿上将功能从一个组件传递到另一个组件的正确方法
- git - 如何在将分支 A 合并到分支 B 时将标签合并到分支?
- reactjs - 在打印 PDF 之前动态修改 React 组件的内容
- django - 如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)
- elasticsearch - elastic中的交叉引用信息