我不明白发生了什么!我有这个网格加载器,当我用它加载小网格时,我的程序工作正常,绘制整个网格。但是现在我用大网格(超过100,000个顶点)测试了程序,它只绘制了一小部分!它是我的显卡的东西,像一些疯狂的小限制或什么?
使用LWJGL,我从他们的教程中选择了一些代码:
private ByteBuffer indexBuffer;
...
// Create a new VBO for the indices and select it (bind)
indxBufId = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indxBufId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW);
...
// Bind to the index VBO that has all the information about the order of the vertices
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indxBufId);
// Draw the vertices
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_BYTE, 0);
// Put everything back to default (deselect)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
答案 0 :(得分:11)
不,过去的自我,这不是你的显卡或任何问题,这是你的索引的问题。你正在使用BYTES作为你的索引缓冲区,这非常好,并且由于它的小尺寸,在使用12个三角形立方体等小型模型时可能更好。
但是如果你的模型在你的顶点数组中运行超过256个索引,你就会被包围。很多。特别是当你要求索引125,647时。
如果你的模型大于256个顶点,它的时间可达到short或int。请记住更改以下内容:
private ByteBuffer indexBuffer; //change to
private ShortBuffer indexBuffer; //or
private IntBuffer indexBuffer;
和这些:
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_BYTE, 0); //fine for up to 256
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0); //up to 65535
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0); //up to 4294967295
请记住,虽然Java的整数,短路和字节都已签名,但OpenGL正在使用unsigned,并会相应地转换缓冲区中的内容。
(虽然这些例子是LWJGL,但这也适用于C语言的普通OpenGL。)