glMultiDrawElementsIndirect-绘制破碎的网格...偏移量问题?

时间:2019-01-28 20:24:10

标签: opengl

我正在尝试构建命令数组,但我一直在获取“破碎”的网格绘制。这是我尝试填充的结构:

我的顶点/索引存储在缓冲区中为:

 QVector<QVector3D> mVertex; // all meshes in 1 vector
 QVector<unsigned int> mIndices; // all meshes in 1 vector
 int mIndicesCount = mIndices.size(); // this is per mesh accessible
 int mVertexCount = mVertex.size(); // this is per mesh accessible

循环:

int skip =0;
int offset =0;
for (size_t u = 0; u < jobSize; ++u) {
    DrawElementsIndirectCommand *cmd = &dstCmds[u];
    cmd->count = mNodeList[u]->mIndicesCount;
    cmd->instanceCount = 1;
    cmd->firstIndex = skip;
    cmd->baseVertex = offset;
    cmd->baseInstance = 1;
    skip += (mNodeList[u]->mIndicesCount * sizeof(unsigned int));
    offset += (mNodeList[u]->mVertexCount / sizeof(unsigned int));
}

any1在这里看到任何错误吗?我迷路了。

也尝试过这个:

    skip += (mNodeList[u]->mIndicesCount / sizeof(unsigned int));
    offset += (mNodeList[u]->mVertexCount);

基于> OpenGL glMultiDrawElementsIndirect with Interleaved Buffers

编辑2 我无法使它与注释中的建议一起使用,或者我做错了什么...这是负责构建缓冲区和命令的主要代码。 PS。此练习是关于尝试遵循AZDO- https://github.com/nvMcJohn/apitest/blob/master/src/solutions/untexturedobjects/gl/bufferstorage.cpp

int jobSize = mNodeList.size();

QVector<QVector3D> mVertex;
QVector<QVector3D> mNormals;
QVector<unsigned int> mIndices;
for (auto &node:mNodeList) {
    mVertex.append(node->mVertex);
    mNormals.append(node->mVertexNormal);
    mIndices.append(node->mIndices);
}
glBindVertexArray(m_varray);

glBindBuffer(GL_ARRAY_BUFFER, m_vb);
glBufferData(GL_ARRAY_BUFFER, mVertex.size() * sizeof(QVector3D), &mVertex[0], GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ib);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndices.size() * sizeof(unsigned int), &mIndices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
mShader->enableAttributeArray("In_v3Pos");
mShader->setAttributeBuffer("In_v3Pos", GL_FLOAT, 0, 3, sizeof(QVector3D));

glBindBuffer(GL_ARRAY_BUFFER, m_vn);
glBufferData(GL_ARRAY_BUFFER, mNormals.size() * sizeof(QVector3D), &mNormals[0], GL_STATIC_DRAW);
mShader->enableAttributeArray("In_v3Color");
mShader->setAttributeBuffer("In_v3Color", GL_FLOAT, 0, 3, sizeof(QVector3D));


const GLbitfield mapFlags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT;
const GLbitfield createFlags = mapFlags | GL_DYNAMIC_STORAGE_BIT;

mCommands.Destroy();
mCommands.Create(BufferStorage::PersistentlyMappedBuffer, GL_DRAW_INDIRECT_BUFFER, 3 * jobSize, createFlags, mapFlags);
mTransformBuffer.Destroy();
mTransformBuffer.Create(BufferStorage::PersistentlyMappedBuffer, GL_SHADER_STORAGE_BUFFER, 3 * jobSize, createFlags, mapFlags);

glBindVertexArray(0);

DrawElementsIndirectCommand *dstCmds = mCommands.Reserve(jobSize);

int skip = 0;
int offset = 0;
for (size_t u = 0; u < jobSize; ++u) {
    DrawElementsIndirectCommand *cmd = &dstCmds[u];
    cmd->count = mNodeList[u]->mIndicesCount;
    cmd->instanceCount = 1;
    cmd->firstIndex = skip*sizeof(unsigned int);
    cmd->baseVertex = offset;
    cmd->baseInstance = 0;
    skip += mNodeList[u]->mIndicesCount ;
    offset += mNodeList[u]->mVertexCount;
}

0 个答案:

没有答案