--- title: 渲染控制器 category: 基础 tags: - beginner mentions: - SirLich - MedicalJewel105 - Overload252 - ChibiMango --- # 渲染控制器 渲染控制器是资源包中常被误解的部分。但您无需畏惧!您可以将渲染控制器视为逻辑包,它们接收来自资源包实体文件中的短名称定义,并决定这些资源在游戏中如何组合/分层/渲染。 ## 定义短名称 渲染控制器基于资源包实体文件中的短名称定义运作。短名称是我们在资源包实体文件中定义的本地标识符,可供渲染控制器(及其他地方)调用。我们可以在实体中定义`geometry`(几何体)、`materials`(材质)和`textures`(纹理)等变量。 让我们看看蜘蛛资源包实体文件的简化版本: ::: code-group ```json [RP/entity/spider.json] { "format_version": "1.8.0", "minecraft:client_entity": { "description": { "identifier": "minecraft:cave_spider", "materials": { "default": "spider", "invisible": "spider_invisible" }, "textures": { "default": "textures/entity/spider/cave_spider" }, "geometry": { "default": "geometry.spider.v1.8" }, "render_controllers": ["controller.render.spider"] } } } ``` ::: 此示例中创建了四个短名称定义: - `default`(材质数组) - `invisible`(材质数组) - `default`(纹理数组) - `default`(几何体数组) 您可以在每个数组中定义多个短名称(如上方的材质示例)。将短名称定义视为_导入_所需资源的操作。在此阶段,您在定义实体要使用的纹理、几何体和材质。在渲染控制器阶段不会导入新内容,而是使用已导入的资源来构建最终渲染的实体。 ## 简单渲染控制器 一个基础渲染控制器示例如下: ::: code-group ```json [RP/render_controllers/cow.render.json] { "format_version": "1.8.0", "render_controllers": { "controller.render.cow": { "geometry": "Geometry.default", "materials": [ { "*": "Material.default" } ], "textures": ["Texture.default"] } } } ``` ::: 该控制器从实体文件获取短名称定义并进行_渲染_。例如`"textures": [ "Texture.default"]`表达:"采用default纹理并应用于实体"。渲染控制器本身并不知晓default纹理的具体内容,只是执行应用指令。 ## 复用渲染控制器 由于渲染控制器基于短名称工作,您可以在所有实体中复用同一个渲染控制器。对于只含单一材质、单一纹理和单一几何体的简单实体,无需创建自定义渲染控制器。 例如上方示例的控制器用于`minecraft:cow`实体。若要在自定义包中使用此控制器,只需在实体文件中声明:`"render_controllers": [ "controller.render.cow" ]`。 :::warning 注意! 渲染控制器基于短名称工作。若使用牛的渲染控制器,必须提供其所需的短名称: - `default`几何体 - `default`纹理 - `default`材质 ::: ## 创建自定义渲染控制器 当我们需要更精细控制实体渲染时(如分层纹理、多重几何体、不同骨骼应用不同材质),可通过复制原版渲染控制器到`render_controllers`文件夹进行定制化修改。 ## 纹理分层 通过纹理分层技术可为自定实体创建叠加纹理。基础思路是通过多个纹理的透明像素区域实现叠加显示。 假设一个**画框**实体:框架固定但画面可变。虽然可以复制10个框架纹理并制作10幅画作,但修改框架时需要改动所有文件。采用分层纹理方案时,首先放置框架纹理,再叠加画作纹理,即可实现框架的集中管理。 ### 通过渲染控制器实现 若对渲染控制器不熟悉,建议参考原版案例。例如含有多个纹理的`horse`实体具有典型参考价值。 #### 渲染控制器 ::: code-group ```json [RP/render_controllers/controller.render.texture_layering.json] { "format_version": "1.10.0", "render_controllers": { "controller.render.texture_layering": { "geometry": "Geometry.default", "materials": [ { "*": "Material.default" } ], "textures": [ // 你可以添加任意数量的图层,按从上到下的顺序叠加 "Texture.bottom_layer", "Texture.top_layer" ] } } } ``` ::: #### 实体配置 需要定义所有纹理并使用`villager_v2_masked`材质: ::: code-group ```json [RP/entity/my_entity.json] "materials": { "default": "villager_v2_masked" }, "textures": { "top_layer": "textures/top", "bottom_layer": "textures/bottom" // 在此添加更多纹理短名称定义 } ``` ::: ### 动态变体分层 通过动态索引实现纹理切换能创造更灵活的效果: #### 实体配置 定义多个顶部纹理以供索引: ::: code-group ```json [RP/entity/my_entity.json#description] "textures": { "top_1": "textures/top_1", "top_2": "textures/top_2", "top_3": "textures/top_3", "bottom_layer": "textures/bottom" } ``` ::: #### 渲染控制器 ::: code-group ```json [RP/render_controllers/controller.render.wool_only] { "format_version": "1.10.0", "render_controllers": { "controller.render.wool_only": { "arrays": { "textures": { "Array.top": [ "Texture.top_1", "Texture.top_2", "Texture.top_3" ] } }, "geometry": "Geometry.default", "materials": [ { "*": "Material.default" } ], "textures": [ "Texture.bottom", // 静态底层纹理 "Array.top[q.variant]" // 根据实体变体选择顶部纹理 ] } } } ``` ::: 通过数组和`q.variant`查询,可根据实体variant值动态选择顶部纹理。 #### 设置变体值 要使分层显示生效,需在实体中设置variant组件: ::: code-group ```json [BP/entities/my_entity.json#components] "minecraft:variant": { "value": 0 } ``` ::: 注意组件参数采用零索引制,`0`对应第一个纹理,`1`和`2`对应后续纹理。 #### 动态更换纹理 如需在游戏中动态更换纹理,只需修改`variant`值。可通过组件组和事件系统实现此功能。 #### 动态分层进阶 通过添加更多纹理数组和使用虚拟组件(dummy components)作为索引,可实现更复杂的动态分层效果。关于虚拟组件的详细信息请参阅[此文档](/wiki/entities/dummy-components)。 ### 动态几何体切换 动态切换几何体的原理与纹理类似: 以下示例展示如何根据variant值切换不同几何体。注意几何体不可分层叠加,因此不需要基础层定义,但仍需使用`villager_v2_masked`材质。 ::: code-group ```json [RP/render_controllers/controller.render.player.third_person.json] { "format_version": "1.8.0", "render_controllers": { "controller.render.player.third_person": { "materials": [ { "*": "Material.default" } ], "textures": [ "Texture.bottom", "Array.top[q.variant]" ], "arrays": { "geometries": { "Array.geo": [ "Geometry.default", "Geometry.custom_1", "Geometry.custom_2" ] }, "textures": { "Array.top": [ "Texture.bottom", "Texture.top_1", "Texture.top_2" ] } }, "geometry": "Array.geo[q.variant]" } } } ``` ::: #### 实体配置 确保在实体文件中包含对应几何体变体: ::: code-group ```json "geometry": { "default": "geometry.entity.default", "custom_1": "geometry.entity.custom_1", "custom_2": "geometry.entity.custom_2" } ``` ::: ## 常见错误 在渲染控制器中: - 可引用多个纹理但只能引用一个几何体(数组形式亦适用) ::: code-group ```json "arrays": { "textures": { "array.skin": [], "array.dress": [] }, "geometries": { "array.geo": [] } } ``` ```json "textures": [ "array.skin[q.variant]", "array.dress[q.skin_id]" ], "geometry": "array.geo[q.mark_variant]" ``` :::