OpenGL仅渲染第一个创建的物体 无法绘制多个三角形问题求助
OpenGL仅能渲染第一个模型问题排查与解决方案
核心问题:索引未加偏移
你合并两个模型顶点到全局vertices数组后,第二个模型的索引仍然是其独立加载时的相对索引(范围0~7,对应自身8个顶点),但此时第二个模型的顶点在全局数组中的起始位置为第8个顶点(第一个模型共8个顶点,占24个float),所以追加的索引全部指向第一个模型的顶点,导致两个模型实际渲染的都是第一个立方体,位置重合时只会看到一个。
修复方法
在createShapeAndBufferit方法追加索引前,先计算当前已有的顶点数量作为偏移量,给每个新增索引加上该偏移:
void Objets::createShapeAndBufferit(Shapes shape) { // 计算偏移量:现有顶点数 = 现有float数 / 3(每个顶点3个float) GLuint vertexOffset = vertices.size() / 3; for (int a = 0; a < shape.getVertices().size(); a++) vertices.push_back(shape.getVertices().at(a)); for (int b = 0; b < shape.getIndices().size(); b++) // 给每个索引加上偏移量 indices.push_back(shape.getIndices().at(b) + vertexOffset); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW); }
其他待优化/修复点
- 冗余配置问题:
glEnableVertexAttribArray、glVertexAttribPointer只需在VAO初始化时配置一次,无需每次加载模型都重复调用 - 颜色属性隐患:顶点着色器声明了
location=1的aColor输入,但你未绑定对应颜色缓冲、也未传入颜色数据,虽然当前片段着色器写死了红色不会触发问题,后续修改着色器时需要要么删除无用的颜色输入逻辑,要么补充颜色数据的配置 - 多模型变换问题:当前
dessiner方法仅设置了一个变换矩阵,所有顶点共用同一个位移,如果需要两个模型在不同位置显示,需要给每个模型单独存储变换矩阵,绘制时循环设置矩阵并调用glDrawElements指定对应模型的索引范围
内容的提问来源于stack exchange,提问作者gaetan sadous
相关产品推荐
相关产品推荐

