烘焙模型

BakedModel

BakedModel 是原版模型加载器调用 UnbakedModel#bake 或自定义加载器调用 IUnbakedGeometry#bake 的结果。UnbakedModel 和 IUnbakedGeometry 只表示形状,没有物品或方块的概念;BakedModel 则没有那么抽象。它表示经过优化和简化、几乎可以发送到 GPU 的几何体,也可以处理物品或方块状态以改变模型。

原版 UnbakedModel 和自定义 IUnbakedGeometry 均可烘焙为 BakedModel;getQuads 返回包含底层顶点数据的 BakedQuad 列表,方块与物品的 BlockState 输入不同。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

大多数情况下不必手动实现此接口,可以使用已有实现。

getOverrides

返回模型使用的 ItemOverrides,只在模型作为物品渲染时使用。

useAmbientOcclusion

当模型作为世界中的方块渲染、该方块不发光且启用了环境光遮蔽时,使模型使用环境光遮蔽渲染。

isGui3d

当模型作为物品在物品栏、地面实体、展示框等位置渲染时,此方法使模型看起来“扁平”。在 GUI 中还会禁用光照。

isCustomRenderer

重要:除非了解自己在做什么,否则直接返回 false。

作为物品渲染时,返回 true 会使模型本身不被渲染,转而调用 BlockEntityWithoutLevelRenderer#renderByItem。对于箱子、旗帜等某些原版物品,该方法硬编码为先将数据从物品复制到 BlockEntity,再通过 BlockEntityRenderer 渲染方块实体代替物品。其他物品使用 IClientItemExtensions#getCustomRenderer 提供的 BlockEntityWithoutLevelRenderer 实例。详见 BlockEntityWithoutLevelRenderer。

getParticleIcon

返回粒子使用的纹理。对于方块,实体落在方块上或方块破坏时会显示;对于物品,物品损坏或被吃掉时会显示。

重要:无参数的原版方法已弃用,推荐 #getParticleIcon(ModelData),因为模型数据可能影响特定模型的渲染。

getTransforms

已弃用,推荐实现 #applyTransform。实现后默认的 #getTransforms 即可。参见变换。

applyTransform

参见变换。

getQuads

这是 BakedModel 的主要方法,返回 BakedQuad 列表。这些对象包含用于渲染模型的底层顶点数据。作为方块渲染时,传入的 BlockState 非空;作为物品渲染时,#getOverrides 返回的 ItemOverrides 负责处理物品状态,BlockState 参数为 null。

注意:BakedQuad 顶点的原点是西北方的底角。坐标小于 0 或大于 1 会将顶点放在方块外。为避免光照问题,应按逆时针顺序提供顶点。

传入的 Direction 用于面剔除。如果所渲染方块的给定侧相邻方块不透明,则不渲染与该侧关联的面。参数为 null 时,返回所有不与某一侧关联的面,这些面永远不会被剔除。rand 参数是 Random 实例。

方法还接收非空的 ModelData,可通过 ModelProperty 定义渲染特定模型时的额外数据。例如 CompositeModel$Data 用于存储使用 forge:composite 加载器的模型的额外子模型数据。

此方法调用频繁:世界中每个方块的每个未剔除面与受支持方块渲染层组合都会调用一次,每个方块可能调用 0 到 28 次。应尽可能快速,并充分使用缓存。

原文:BakedModel。