LWJGL教程06 - 优化Mesh

减少顶点数量

运行结果

1
2
3
4
5
6
7
8
float[] vertices1 = new float[] {
-0.5f, 0.5f, 0.0f, // v1
-0.5f, -0.5f, 0.0f, // v2 = v5
0.5f, 0.5f, 0.0f, // v3 = v4
0.5f, 0.5f, 0.0f, // v4 重复
-0.5f, -0.5f, 0.0f, // v5 重复
0.5f, -0.5f, 0.0f, // v6
};

这是这个矩形的顶点。

一共有6个顶点,但是一个矩形只需4个就足够。

可以发现,v2v3重复传递了。

当三角形数量增加时,重复传递的顶点就会变很多。

一个顶点可以共享给多个三角形。

索引缓冲区

使用索引数据绘制三角形。

将索引合并上传给GPU,这样能节约性能。

假设有四个点。

四个点

合并的顶点数据。

1
2
3
4
5
6
float[] vertices = new float[] {
x1, y1, z1, // p0
x2, y2, z2, // p1
x3, y3, z3, // p2
x4, y4, z4 // p3
}

合并的索引数据。

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, // v1
-0.5f, -0.5f, 0.0f, // v2
0.5f, 0.5f, 0.0f, // v3
0.5f, -0.5f, 0.0f, // v4
};
int[] indices = new int[] {
0, 1, 3,
2, 0, 3
};

Mesh mesh = new Mesh(vertices, indices);

Engine.scene.addMesh(mesh);
}

[...]
}

运行结果


LWJGL教程06 - 优化Mesh
https://panxy02.github.io/2024/07/18/lwjgl-06/
作者
52Hertz
发布于
2024年7月18日
许可协议