1

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

现在我得到了以下设置:

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

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

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

所以如果我先渲染三角形数据,它就像:

三角形然后立方体

如果我先渲染立方体,它就像:

立方体然后三角形

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

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

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

这是我用来准备 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))   
);
4

1 回答 1

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。

于 2013-01-30T21:43:03.367 回答