主题
渲染架构
CPU/GPU 双路径渲染管线,支持 256 骨骼 GPU Skinning、可扩展渲染层、多材质子网格。
架构总览
CPU vs GPU 路径
| 维度 | CPU 路径 | GPU 路径 |
|---|---|---|
| 变换位置 | CPU 逐顶点 | GPU 顶点着色器 |
| DrawCall 数 | 每骨骼 1 次 | 每材质 1 次 |
| 内存布局 | 动态 VBO | 静态 VBO + UBO |
| 适用场景 | 兼容模式、少量实体 | 大规模实体渲染 |
| 骨骼上限 | 无限制 | 256 |
GPU Skinning 详解
骨骼矩阵 UBO
| 属性 | 值 |
|---|---|
| 布局 | std140 |
| 内容 | mat4 bones[256] |
| 大小 | 256 × 64 bytes = 16 KB |
| 隐藏骨骼 | 零矩阵 |
| 可见骨骼 | 模型空间变换矩阵 |
每帧流程:
- DFS 遍历骨骼层级,累积模型空间矩阵
- 写入 CPU staging buffer(跳过隐藏骨骼)
- 上传到 GPU UBO
- 着色器按
boneIndex索引矩阵
顶点格式
GPU 路径使用紧凑顶点布局(36 bytes/vertex):
| 偏移 | 大小 | 属性 |
|---|---|---|
| 0 | 12 | Position (vec3) |
| 12 | 4 | Color (RGBA8) |
| 16 | 8 | UV0 (vec2) |
| 24 | 4 | UV1 / Overlay (short2) |
| 28 | 4 | UV2 / Light (short2) |
| 32 | 3 | Normal (int8 × 3) |
| 35 | 1 | BoneIndex (uint8) |
GPUBedrockMesh
整个模型烘焙为单个 VBO/IBO,按材质分割子网格:
| 区域 | 内容 |
|---|---|
| VBO | 所有骨骼的顶点(连续存储) |
| IBO | 所有三角形索引 |
| SubMesh[0] | material=CUTOUT, indexOffset=0, indexCount=1200 |
| SubMesh[1] | material=EMISSIVE, indexOffset=1200, indexCount=300 |
| ... | 按材质继续分割 |
Shader Uniforms
| Uniform Block | 内容 |
|---|---|
DynamicTransforms | ModelView 矩阵、颜色调制、纹理矩阵 |
BoneMatrices | 256 × mat4 骨骼变换 |
EntityNormal | 法线矩阵 + packed light |
Sampler0 | 主纹理 |
Sampler1 | Overlay 纹理 |
Sampler2 | 光照纹理 |
渲染层
渲染层(Render Layer)是可扩展的后处理通道,在基础模型渲染后叠加额外视觉效果:
内置渲染层
| 层 | 说明 |
|---|---|
| AutoGlowingBedrockLayer | 自动发光效果,基于骨骼名或配置 |
| ItemArmorBedrockLayer | 盔甲片渲染,绑定到指定骨骼 |
| ItemInHandBedrockLayer | 手持物品渲染 |
| BlockAndItemBedrockLayer | 方块/物品模型渲染(骨骼挂载) |
| CustomBoneTextureBedrockLayer | 逐骨骼纹理覆盖 |
| TextureLayerBedrockLayer | 纹理层合成(多层叠加) |
实体模型专用渲染层
生物模型在内置层之上还有专用层:
- Behavior Layer — 行为驱动的视觉变化
- Bone Display Layer — 骨骼展示物品/方块
- Exclusion Layer — Manifest 排除规则
- Override Layer — 骨骼覆盖变换
- Part Layer — 骨骼部件切换
- Petrify Layer — 石化视觉效果
- Segment Layer — 分段行为渲染
- Submodel Layer — 子模型挂载渲染