92 lines
3.6 KiB
Markdown
92 lines
3.6 KiB
Markdown
## 1️⃣ `VertexFormat` 的作用
|
||
|
||
在 Minecraft 渲染系统中,`VertexFormat` 是**顶点格式的描述类**。它定义了:
|
||
|
||
* 每个顶点包含哪些属性(position、color、normal、uv 等)
|
||
* 每个属性的数据类型和大小
|
||
* 这些属性在 GPU 缓冲区中的排列顺序(stride 和 offset)
|
||
|
||
换句话说,它告诉 GPU **如何从 VBO 里正确读取顶点数据**。
|
||
|
||
Minecraft 不再直接使用 `glVertex3f` 或 `glColor4f`,而是通过 `VertexFormat` + `BufferBuilder` 构建顶点数组,然后一次性上传到 GPU。
|
||
|
||
---
|
||
|
||
## 2️⃣ `VertexFormat` 的核心结构
|
||
|
||
在 Minecraft 中,`VertexFormat` 类主要包含:
|
||
|
||
| 成员 | 含义 |
|
||
| ------------ | ---------------------------------- |
|
||
| `elements` | 顶点属性列表,每个元素是 `VertexFormatElement` |
|
||
| `vertexSize` | 每个顶点的总字节数(stride) |
|
||
| `hasColor` | 是否包含颜色属性 |
|
||
| `hasNormal` | 是否包含法线 |
|
||
| `hasUV` | 是否包含纹理坐标 |
|
||
|
||
### `VertexFormatElement`
|
||
|
||
每个元素描述一个顶点属性,包含:
|
||
|
||
| 属性 | 含义 |
|
||
| ------- | -------------------------------------- |
|
||
| `type` | 数据类型(FLOAT、UBYTE 等) |
|
||
| `usage` | 属性用途(POSITION、COLOR、UV、NORMAL、PADDING) |
|
||
| `count` | 该属性的分量个数(例如 POSITION = 3, COLOR = 4) |
|
||
| `index` | 纹理坐标索引(有多个 UV 时用) |
|
||
|
||
**示例:**
|
||
Minecraft 默认块渲染顶点格式可能包含:
|
||
|
||
```text
|
||
POSITION (3 floats)
|
||
COLOR (4 bytes)
|
||
UV0 (2 floats)
|
||
NORMAL (3 bytes)
|
||
UV1 (2 floats, 光照贴图)
|
||
```
|
||
|
||
---
|
||
|
||
## 3️⃣ `VertexFormat` 在渲染管线中的位置
|
||
|
||
1. **顶点构建**
|
||
|
||
```java
|
||
BufferBuilder buffer = Tesselator.getInstance().getBuilder();
|
||
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
|
||
buffer.vertex(x, y, z).color(r, g, b, a).uv(u, v).normal(nx, ny, nz).endVertex();
|
||
```
|
||
|
||
2. **上传 GPU**
|
||
|
||
* `BufferBuilder` 会根据 `VertexFormat` 的定义把每个顶点的数据打包成连续的 **VBO 字节流**
|
||
* 使用 `glVertexAttribPointer` 告诉 GPU 每个属性的偏移量和类型
|
||
|
||
3. **绑定着色器**
|
||
|
||
* 着色器使用 `layout(location = X)` 对应 VertexFormat 的属性
|
||
* GPU 就能正确读取每个顶点属性用于渲染
|
||
|
||
---
|
||
|
||
## 4️⃣ 常用顶点格式示例
|
||
|
||
Minecraft 1.20.1 内置了几种常用格式:
|
||
|
||
| 名称 | 用途 |
|
||
| ----------------------------------------------- | ----------------------------------------- |
|
||
| `DefaultVertexFormat.POSITION_COLOR` | GUI、简单方块渲染 |
|
||
| `DefaultVertexFormat.BLOCK` | 方块渲染,包含 position/color/uv/normal/lightmap |
|
||
| `DefaultVertexFormat.ITEM` | 物品渲染,类似 BLOCK |
|
||
| `DefaultVertexFormat.POSITION_TEX_COLOR_NORMAL` | 高级渲染,需要所有属性 |
|
||
|
||
---
|
||
|
||
## 5️⃣ 总结
|
||
|
||
* `VertexFormat` 是 **顶点数据布局描述器**,告诉 GPU 每个顶点包含哪些属性、类型和顺序。
|
||
* Minecraft 的现代渲染完全基于 **VBO + VAO + 着色器**,`VertexFormat` 作为桥梁,让 Java 层构建的顶点数据正确映射到 GPU。
|
||
* 对于 mod 开发或自定义渲染,理解 VertexFormat 非常关键,因为你需要确保 **BufferBuilder 构建的数据格式和着色器匹配**。
|
||
|