LWJGL 顶点索引缓冲区导致 "Mesh" 的一半加载
LWJGL Vertex Index Buffer causes half of "Mesh" to load
我正在关注 Antonio Bejarano 的《使用 LWJGL 进行 3D 游戏开发》一书。我已经达到了能够将四边形渲染到屏幕的程度。实现顶点索引缓冲区后,四边形中只有一个三角形呈现在屏幕上,因此我认为可以安全地假设问题出在该代码上。
// Vertex Index Buffer
idxVboId = glGenBuffers();
vertsIdxBuffer = MemoryUtil.memAllocInt(indices.length);
vertsIdxBuffer.put(indices).flip();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,idxVboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,vertsIdxBuffer,GL_STATIC_DRAW);
顶点缓冲区和颜色缓冲区的代码有效,因为我删除了对索引缓冲区的引用并且出现了完整的四边形。我还更改了渲染方法以说明要渲染的新类型:
shaderProgram.bind();
//bind to vao
glBindVertexArray(mesh.getVaoId());
//enable positions buffer
glEnableVertexAttribArray(0);
//enable colour buffer
glEnableVertexAttribArray(1);
//draw verts
glDrawElements(GL_TRIANGLES,
mesh.getVertexCount(),GL_UNSIGNED_INT,0);
//restore state (?)
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
shaderProgram.unbind();
感谢您提出任何建议,因为我已经盯着它看了好几个小时,但看不出我在哪里犯了错误。
编辑:四边形网格代码
renderer.init();
float[] positions = new float[]{
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
float[] colours = new float[]{0.5f,0f,0f,0f,0.5f,0f,0f,0f,0.5f,0f,0.5f,0.5f};
int[] indices = new int[]{
0, 1, 3, 3, 1, 2,
};
mesh = new BMesh(positions,colours,indices);
第二次编辑
位置数组更改前后
Before
After
查看四边形网格初始化代码后,似乎错误是由于第二个四边形上的顶点 3
和 2
是同一顶点,即两者都在 (0.5, 0.5, 0.0)
.也许您错误地复制了数组中的第 4 个和第 5 个顶点?
即也许你想拥有
float[] positions = new float[]{
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
编辑:您的索引似乎有误。将它们更改为 { 0, 1, 3, 0, 3, 2 }
我正在关注 Antonio Bejarano 的《使用 LWJGL 进行 3D 游戏开发》一书。我已经达到了能够将四边形渲染到屏幕的程度。实现顶点索引缓冲区后,四边形中只有一个三角形呈现在屏幕上,因此我认为可以安全地假设问题出在该代码上。
// Vertex Index Buffer
idxVboId = glGenBuffers();
vertsIdxBuffer = MemoryUtil.memAllocInt(indices.length);
vertsIdxBuffer.put(indices).flip();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,idxVboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,vertsIdxBuffer,GL_STATIC_DRAW);
顶点缓冲区和颜色缓冲区的代码有效,因为我删除了对索引缓冲区的引用并且出现了完整的四边形。我还更改了渲染方法以说明要渲染的新类型:
shaderProgram.bind();
//bind to vao
glBindVertexArray(mesh.getVaoId());
//enable positions buffer
glEnableVertexAttribArray(0);
//enable colour buffer
glEnableVertexAttribArray(1);
//draw verts
glDrawElements(GL_TRIANGLES,
mesh.getVertexCount(),GL_UNSIGNED_INT,0);
//restore state (?)
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
shaderProgram.unbind();
感谢您提出任何建议,因为我已经盯着它看了好几个小时,但看不出我在哪里犯了错误。
编辑:四边形网格代码
renderer.init();
float[] positions = new float[]{
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
float[] colours = new float[]{0.5f,0f,0f,0f,0.5f,0f,0f,0f,0.5f,0f,0.5f,0.5f};
int[] indices = new int[]{
0, 1, 3, 3, 1, 2,
};
mesh = new BMesh(positions,colours,indices);
第二次编辑 位置数组更改前后
Before
After
查看四边形网格初始化代码后,似乎错误是由于第二个四边形上的顶点 3
和 2
是同一顶点,即两者都在 (0.5, 0.5, 0.0)
.也许您错误地复制了数组中的第 4 个和第 5 个顶点?
即也许你想拥有
float[] positions = new float[]{
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
编辑:您的索引似乎有误。将它们更改为 { 0, 1, 3, 0, 3, 2 }