OpenGL组合绘制调用

时间:2014-07-11 12:34:24

标签: c++ opengl

如果我有这样的一系列绘制调用:

void glDrawElementsBaseVertex(GLenum mode = GL_TRIANGLES, GLsizei count = 1188, GLenum type = GL_UNSIGNED_INT, GLvoid* indices = 000354FC, GLint basevertex = 38051)
void glDrawElementsBaseVertex(GLenum mode = GL_TRIANGLES, GLsizei count = 786, GLenum type = GL_UNSIGNED_INT, GLvoid* indices = 0003678C, GLint basevertex = 38847)
void glDrawElementsBaseVertex(GLenum mode = GL_TRIANGLES, GLsizei count = 786, GLenum type = GL_UNSIGNED_INT, GLvoid* indices = 000373D4, GLint basevertex = 39373)
void glDrawElementsBaseVertex(GLenum mode = GL_TRIANGLES, GLsizei count = 786, GLenum type = GL_UNSIGNED_INT, GLvoid* indices = 0003801C, GLint basevertex = 39899)

是否可以将它们组合成一个呼叫? 基本顶点的增量等于前一个计数。唯一的问题是每个调用在不同位置开始的索引。在我的代码中,我创建了一个包含所有起始位置的向量,我记录了第一个调用的基本顶点并累积了计数。完成后我打电话给

glDrawElementsBaseVertex(GL_TRIANGLES,
                    numIdx,
                    GL_UNSIGNED_INT,
                    (idx[0]),
                    baseVc);

问题是该函数正在使用idx [0](包含第一个绘制调用的索引)并继续递增它。我想要它做的是使其idx包含从000354FC到000354FC + 1188(十六进制)的一些索引,并且在此之后,从0003678C到0003678C + 786(十六进制)的索引等等。然后会发生的是,我没有调用4次,而是将其调用一次,计数等于1188 + 786 + 786 + 786,基本顶点38051。 这可能吗?

1 个答案:

答案 0 :(得分:0)

我使用了glMultiDraw命令:

vector<GLsizei> numIdx;
    vector<GLint> baseVc;
    vector<void*> idx;
    unsigned int drawCount = 0;
...
drawCount++;
        numIdx.push_back(m_Entries[i].NumIndices);
        baseVc.push_back(m_Entries[i].BaseVertex);
        idx.push_back((void*)(sizeof(unsigned int) * m_Entries[i].BaseIndex));
...
glMultiDrawElementsBaseVertex(GL_TRIANGLES,
                    &numIdx[0],
                    GL_UNSIGNED_INT,
                    &idx[0],
                    drawCount,
                    &baseVc[0]);

我曾经像这样画画

glDrawElementsBaseVertex(GL_TRIANGLES,
                    m_Entries[i].NumIndices,
                    GL_UNSIGNED_INT,
                    (void*)(sizeof(unsigned int) * m_Entries[i].BaseIndex),
                    m_Entries[i].BaseVertex);