gpt4 book ai didi

java - glDrawElements 没有绘制整个模型

转载 作者:行者123 更新时间:2023-11-29 09:49:08 24 4
gpt4 key购买 nike

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

最佳答案

不是的,过去的自己,不是你显卡什么的问题,是你索引的问题。您正在使用 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。)

关于java - glDrawElements 没有绘制整个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com