You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:06:03