glDrawElementsInstanced - 模型矩阵未正确传输

时间:2014-10-29 20:40:09

标签: opengl lwjgl

我目前正在尝试使用一些教程和LWJGL自学一些OpenGL。显然,我只是在渲染立方体。

到目前为止,我所做的一切,以及对我所做的每个立方体的作用是什么

glUniformMatrix4(RenderProgram.ModelMatrixID, false,
    renderobject.getTransformationBuffer());

glDrawElements(GL_TRIANGLES, renderobject.Model.countIndices(),
    GL_UNSIGNED_INT, renderobject.Model.indexOffset);

由于这只给了我大约50-55 FPS和大约70k的立方体,我决定尝试实例化渲染,如下:

glDrawElementsInstanced(GL_TRIANGLES, Model.countIndices(),
    GL_UNSIGNED_INT, 0, instanceCount);

当然,我事先为此创建了另一个缓冲区,用每个多维数据集的renderobject.getTransformationBuffer()填充它,然后在尝试绘制instanced之前绑定此缓冲区。

我还将它添加到我的顶点着色器中,就像layout(location = 12) in mat4 mModel一样,我已经像这样初始化了attrib指针:

for (int i = 0; i < 4; i++) {
    glEnableVertexAttribArray(12 + i);
    glVertexAttribPointer(12 + i, 4, GL_FLOAT, false, Float.BYTES * 16,
        Float.BYTES * 4 * i);
    glVertexAttribDivisor(InstanceBufferID, 1);
}

我没有任何错误,虽然我在屏幕上看不到任何内容,但它的呈现效果却让我看到FPS增加了大约350%所以我认为我没有找到合适的型号着色器中的矩阵。

不幸的是,我无法在着色器中调试变量内容:)所以我对我可能缺少的内容或我如何解开这一点感到有点难过......而且,显然,谷歌并没有&# 39; t帮助我很多,所以只是提出glDrawElements不为人们工作。

编辑:接受的答案是可以从提供的代码中确定的一个错误。但是,我在代码中有另一个错误,需要修复才能在屏幕上看到最终的内容,我也想分享:我在使用矩阵数据填充VBO之前取消绑定VAO。一旦我将数据加载到VBO中之后我将其解除绑定就行了!

Edit2:有趣的是,现在呈现的东西,性能的提升更为明显。在我的空白屏幕上,我得到大约170 FPS的大约70k立方体。现在它正确渲染我可以获得大约350k00立方体的350-400 FPS!我没想到。

1 个答案:

答案 0 :(得分:2)

glVertexAttribDivisor的第一个参数应该是您要用作实例化数组而不是InstanceBufferID的顶点属性的索引。

这应该成为:

for (int i = 0; i < 4; i++) {
    glEnableVertexAttribArray(12 + i);
    glVertexAttribPointer(12 + i, 4, GL_FLOAT, false, Float.BYTES * 16,
        Float.BYTES * 4 * i);
    glVertexAttribDivisor(12 + i, 1);
}