减少顶点数量

1 2 3 4 5 6 7 8
| float[] vertices1 = 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, };
|
这是这个矩形的顶点。
一共有6个顶点,但是一个矩形只需4个就足够。
可以发现,v2
和v3
重复传递了。
当三角形数量增加时,重复传递的顶点就会变很多。
一个顶点可以共享给多个三角形。
索引缓冲区
使用索引数据绘制三角形。
将索引合并上传给GPU,这样能节约性能。
假设有四个点。

合并的顶点数据。
1 2 3 4 5 6
| float[] vertices = new float[] { x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 }
|
合并的索引数据。
1 2 3 4
| int[] indices = new int[] { p0, p1, p2, p3, p0, p2 }
|
值得一提的是,openGL习惯逆时针为正方向。
修改Mesh类
将Mesh
的构造函数稍微修改一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public Mesh(float[] vertices, int[] indices) { this.verticesCount = indices.length;
[...]
vboId = glGenBuffers(); IntBuffer indicesBuffer = MemoryUtil.memAllocInt(indices.length); indicesBuffer.put(indices).flip(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
[...] MemoryUtil.memFree(indicesBuffer); }
|
然后将Render.rener()
中的glDrawArrays(GL_TRIANGLES, 0, mesh.getVerticesCount());
改为glDrawElements(GL_TRIANGLES, mesh.getVerticesCount(), GL_UNSIGNED_INT, 0);
最后测试一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| [imports ...]
public class TestLogic implements ILogic {
@Override public void init() { float[] vertices = 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, }; int[] indices = new int[] { 0, 1, 3, 2, 0, 3 };
Mesh mesh = new Mesh(vertices, indices);
Engine.scene.addMesh(mesh); }
[...] }
|
