渲染流程
1 | public void renderStatic(ItemStack arg, ItemDisplayContext arg2, int i, int j, PoseStack arg3, MultiBufferSource arg4, Level arg5, int k) { |
我们从渲染调用链一步步向下看,会在renderStatic
中调用getModel
方法以获取模型,这里mc对三叉戟和望远镜进行了特判。让我们看看mc中三叉戟的json文件
1 | { |
这里发现他的父类型是builtin/entity
,意味着它getModel
返回的将是一个BuiltInModel
对象,这是一个占位符空模型,意味着在以下的渲染流程中会特殊判别,其中isCustomRenderer
默认返回true
接下来对普通的物品,调用getItemModel
获取一个一般的物品模型,然后看看模型中有没有overrides
字段,对当前模型进行替换,比如如上的三叉戟中,当符合throwing
条件时,替换为item/trident_throwing
模型,最后,如果前面都获取失败了,返回默认的紫黑块模型。
当然如果想要替换原版的紫黑块,可以mixin这个getMissingModel()
方法
看起来mc只对三叉戟和望远镜进行了特判,但是在net.minecraft.client.renderer.entity.ItemRenderer#renderStatic
中的下一步,在render
方法中,麻将再次展现了他无与伦比的硬编码技术
在neoforge对render
方法进行了patch,加入了net.neoforged.neoforge.client.extensions.IBakedModelExtension#getRenderPasses
以便开发者可以自定义多层级模型。
1 |
|
这里我们发现麻将再次对三叉戟进行了特判,加入到了CustomRender
的行列中,在特殊的CustomRender
中,将不返回模型回正常渲染流程,而是直接将模型烘焙完成后上传。
在net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer#renderByItem
在我们可以看到一大堆各种各样的硬编码特判,麻将你赢了。