video | code |
---|---|
https://www.youtube.com/watch?v=4O0_-1NaWnY,https://www.bilibili.com/video/BV1oj411p7qM/? | https://github.com/jdah/minecraft-weekend |
项目依赖
在构建主项目之前,必须构建以下 lib/ 静态库:
– | ||
---|---|---|
GLAD | lib/glad/src/glad.o | |
CGLM | 高度优化的 C 图形数学 (glm) | lib/cglm/.libs/libcglm.a |
GLFW | 一个开源多平台库,适用于 OpenGL、OpenGL ES 和 桌面上的 Vulkan 开发。它提供了一个简单的API来创建 窗口、上下文和表面,接收输入和事件。GLFW 采用 C 语言编写,支持 Windows、macOS、X11 和 Wayland。 | lib/glfw/src/libglfw3.a |
libnoise | lib/noise/libnoise.a |
VAO(Vertex Array Object)和VBO(Vertex Buffer Object)
在图形编程中,特别是使用OpenGL或类似图形API的情况下,VAO(Vertex Array Object)和VBO(Vertex Buffer Object)是用于管理顶点数据的重要概念。
-
VBO(Vertex Buffer Object):
- 作用:VBO是用来存储顶点数据的缓冲区对象。顶点数据包括顶点坐标、颜色、法线等信息。
- 使用场景:通常,一个VBO包含所有的顶点数据,以便能够高效地将它们传递给GPU。
- 好处:使用VBO能够减少CPU和GPU之间的数据传输次数,提高性能。
-
VAO(Vertex Array Object):
- 作用:VAO是用于封装和存储顶点数组状态的对象。它保存了顶点缓冲区对象(VBO)的状态,以及顶点属性指针、顶点索引等。
- 使用场景:当你有多个VBO时,可以使用VAO将它们组织起来,方便地进行状态切换。
- 好处:VAO的使用可以帮助你更高效地管理和维护多个顶点数组对象。
简而言之,VBO用于存储实际的顶点数据,而VAO用于存储渲染时需要的状态和指针信息。在OpenGL中,使用它们的一般流程是:
- 创建并绑定一个VAO。
- 在VAO中启用和配置顶点属性指针,包括启用VBO。
- 创建并绑定一个或多个VBO,将顶点数据传递给它们。
- 解绑VAO和VBO,以避免意外修改。
这种结构的使用能够有效地减少不必要的状态切换,提高图形渲染的效率。在现代OpenGL中,使用VAO和VBO已经成为标配,尤其是在处理大量顶点数据时。
纹理图集
纹理图集(Texture Atlas)是一种将多个小纹理图合并到一个大纹理中的技术。这种技术的目的是减少图形渲染中的资源开销,提高渲染效率。通常,这个大纹理包含了游戏或应用程序中需要使用的多个小纹理,这些小纹理可以是角色、场景元素、GUI元素等。
以下是纹理图集的一些主要优势和用途:
-
减少渲染调用:使用一个大的纹理图集,而不是多个小纹理,可以减少渲染调用的次数。这有助于提高渲染效率,特别是在图形API中存在批处理机制的情况下。
-
减少内存占用:合并小纹理到一个图集中可以减少内存的占用,因为每个小纹理都需要一定的内存。这对于移动设备和性能受限的环境尤为重要。
-
减少纹理切换:在图集中,所有的纹理都在同一个大纹理中,减少了纹理切换的需求。这对于图形渲染中的状态切换来说是一项优化。
-
提高纹理缓存命中率:当纹理数据紧密打包在一起时,有助于提高纹理缓存的命中率,减少纹理读取的性能损失。
使用纹理图集的一般步骤包括:
-
创建纹理图集:将所有小纹理合并到一个大纹理中。这可以手动完成,也可以使用专门的工具进行自动打包