我目前正在尝试使用一些教程和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!我没想到。
答案 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);
}