LWJGL教程05 - 改进渲染

让Mesh类创建VBO和VAO对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[imports ...]

public class Mesh {
private float[] vertices;
private int verticesCount;
private int vaoId;
private int vboId;

public Mesh(float[] vertices) {
this.vertices = vertices;
this.verticesCount = vertices.length / 3;

FloatBuffer verticesBuffer = MemoryUtil.memAllocFloat(this.vertices.length);
verticesBuffer.put(this.vertices).flip();

// 顶点
vaoId = glGenVertexArrays();
glBindVertexArray(vaoId);
vboId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
// 解绑VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
// 解绑VAO
glBindVertexArray(0);

MemoryUtil.memFree(verticesBuffer);
}

[G etter ...]

public void cleanup() {
glDisableVertexAttribArray(0);

// 删除VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(vboId);

// 删除VAO
glBindVertexArray(0);
glDeleteVertexArrays(vaoId);
}
}

一个程序不会只有一个Mesh,所以创建Scene来存储多个Mesh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[imports ...]

public class Scene {
private List<Mesh> meshes = new ArrayList<>();

public List<Mesh> getMeshes() {
return meshes;
}

public void addMesh(Mesh mesh) {
meshes.add(mesh);
}

public void cleanup() {
meshes.forEach(Mesh::cleanup);
}
}

然后在Engine中实例化它。

修改Render.render()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void render(Scene scene) {
[...]

Render.shaderProgram.bind();

scene.getMeshes().forEach((mesh) -> {
// 绑定VAO
glBindVertexArray(mesh.getVaoId());

// 绘制顶点
glDrawArrays(GL_TRIANGLES, 0, mesh.getVerticesCount());

// 还原状态
glBindVertexArray(0);
});

Render.shaderProgram.unbind();
}

然后在Engine.cleanup()中记得调用Scene.cleanup()。

1
2
3
4
5
6
private void cleanup() {
logic.cleanup();
Render.cleanup();
scene.cleanup();
Window.cleanup();
}

最后测试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[imports ...]

public class TestLogic implements ILogic {

@Override
public void init() {
float[] vertices1 = new float[]{
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};

float[] vertices2 = new float[]{
-1.0f, 1.0f, 0.0f,
-1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f
};

Mesh mesh1 = new Mesh(vertices1);
Mesh mesh2 = new Mesh(vertices2);

Engine.scene.addMesh(mesh1);
Engine.scene.addMesh(mesh2);
}

[...]
}

运行结果

在测试一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[imports ...]

public class TestLogic implements ILogic {

@Override
public void init() {
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,
};

Mesh mesh1 = new Mesh(vertices1);

Engine.scene.addMesh(mesh1);
}

[...]
}

运行结果

成功渲染一个矩形。

但有个致命缺点:顶点太多。

之后更改。


LWJGL教程05 - 改进渲染
https://panxy02.github.io/2024/07/18/lwjgl-05/
作者
52Hertz
发布于
2024年7月18日
许可协议