【问题标题】:OpenGL 3 VBO Indexing Multiple figures (glDrawElements)OpenGL 3 VBO索引多个图形(glDrawElements)
【发布时间】:2013-01-30 20:37:26
【问题描述】:

我正在使用 OpenGL (3.x) 迈出第一步,我计划使用 VAO 和 VBO 绘制多个图形(三角形、立方体、...):

现在我得到了以下设置:

VAO --> VBO [顶点,颜色] + VBO [索引]

其中“顶点”有 [3 * 3floats 三角形顶点,8*3floats 立方体], “颜色”每个顶点都有 RGB(无 alpha), “索引”有 [三角形:0,1,2,正方形:0,1,2, 0,2,3, ...]

现在,如果我使用“glDrawElements”进行绘制。我只看到正确绘制的系列中的第一个图(并获得正确的颜色),第二个不能正常工作。

所以如果我先渲染三角形数据,它会变成这样:

如果我先渲染立方体,它会变成这样:

注意:三角形是红色的,立方体是彩色的,所以第一个图总是按我的预期显示

使用“glDrawArrays”(带有偏移量 + 三角形计数)而不是 drawElements 绘制数组效果很好,但是,当然,索引会使数据数组变得更小。所以我想做这个动作。

如何绘制相同的设置但使用索引?我应该调用其他方法吗?

这是我用来准备 VBO 数据的代码,以防有疑问。

// VBOS solid
    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat),&vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[1]);
    glBufferData(GL_ARRAY_BUFFER, colors.size()*sizeof(GLfloat),&colors[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vboIndex );
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint),&indices[0], GL_STATIC_DRAW);
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );

这是我在渲染时所做的调用。 在这个循环中,三角形的 indicesCount=3 和 offset=0,而立方体分别有 24 和 3。

glDrawElements(
   GL_TRIANGLES,      
   primitives[i]->indicesCount,    
   GL_UNSIGNED_INT,  
   (void*) (primitives[i]->offsetIndices*sizeof(GLuint))   
);

【问题讨论】:

    标签: opengl indexing figure


    【解决方案1】:

    由于我在发布后仍在测试,我终于做了一个工作尝试,使用:

    glDrawElementsBaseVertex(
       GL_TRIANGLES.
       __INDICES_TO_RENDER__,
       GL_UNSIGNED_INT,
       (void*) (__INDICES_RENDERED___*sizeof(GLuint)),
       _VERTICES_RENDERED_BEFORE_   
    );
    

    其中“INDICES_TO_RENDER”和“INDICES_RENDERED_”是计数 3f 的值,因此对于多维数据集,您使用 24floats 作为值“TO_RENDER”,使用 0 到“_RENDERED”。

    “_VERTICES_RENDERED_BEFORE_”作为渲染顶点的人类值,所以在渲染立方体之前,它是0,之后应该是8。

    有点奇怪(可能我做错了什么),但它在我的测试中有效:

    Using an offset with VBOs in OpenGL 上说过,但我试了好几次,直到我找到了要拨打的电话。

    如果专家可以验证这一点,我会更高兴:P。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多