1

我不明白这是怎么回事!我有这个网格加载器,当我用它加载小网格时,我的程序可以正常工作,绘制整个网格。但是现在我用一个大网格(超过 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);
4

1 回答 1

11

不,过去的自己,这不是你的显卡或任何东西的问题,这是你的索引的问题。您正在使用 BYTES 作为索引缓冲区,在使用 12 三角形立方体等小型模型时,这非常好,并且可能由于它的小尺寸而更可取。

但是如果你的模型在你的顶点数组中运行超过 256 个索引,你就会得到环绕。很多。特别是当您要求索引 125,647 时。

如果您的模型大于 256 verts,则需要使用 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 使用的是无符号的,并且会相应地转换缓冲区中的内容。

(虽然这些示例是 LWJGL,但这也适用于 C 语言中的普通 OpenGL。)

于 2012-11-27T04:53:02.793 回答