OpenGL中多形状顶点共用单一顶点数组的实现问题咨询
动态适配多形状顶点的解决方案
用C++标准库的std::vector<GLfloat>替代固定长度数组即可解决需求,std::vector支持动态扩容,可适配任意数量的顶点数据,同时原生支持获取数组首地址和元素总大小,刚好匹配glBufferData的参数要求。
代码修改步骤
- 先在头文件区域新增两个依赖头文件:
#include <vector> #include <cmath>
- 替换原64-81行的固定数组定义逻辑:
// 全局共用同一个顶点容器,仅存储当前选中形状的顶点数据 std::vector<GLfloat> vertices; // 额外存储当前形状的顶点总数,后续绘制调用也可以复用 GLsizei currentVertexCount = 0; if (shapeAnswer == 1) { // 三角形3个顶点 vertices = { -0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f, 0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f, 0.0f, 0.5f * float(sqrt(3)) * 2 / 3, 0.0f }; currentVertexCount = 3; } else if (shapeAnswer == 2) { // 正方形用6个顶点拼接(两个三角形),你原有代码里正方形顶点和三角形一致属于示例错误,这里替换为正确顶点 vertices = { -0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f }; currentVertexCount = 6; }
- 替换原119行的
glBufferData调用:
// vector的size()方法返回元素总个数,乘以单个GLfloat大小就是总字节数 // data()方法返回数组首地址,和固定数组的指针用法完全一致 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);
- 补充你代码中缺失的顶点属性配置和绘制逻辑,放在渲染循环内即可显示形状:
while (!glfwWindowShouldClose(window)) { glClearColor(0.07f, 0.13f, 0.17f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); // 配置顶点属性解析规则 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0); glEnableVertexAttribArray(0); // 绘制当前形状 glDrawArrays(GL_TRIANGLES, 0, currentVertexCount); glfwSwapBuffers(window); glfwPollEvents(); }
方案优势
- 后续新增任意形状只需要新增对应分支的顶点赋值逻辑即可,不需要定义多个固定数组,维护成本极低
- 同一时间内存中仅存储当前选中形状的顶点数据,没有额外内存浪费,适配上百种形状也不会增加静态内存占用
- 完全兼容OpenGL原生API的参数要求,不需要额外的类型转换
内容的提问来源于stack exchange,提问作者Miximan
相关产品推荐
相关产品推荐

