Cat_Anchor 发表于 2023-2-25 07:35:54

附加包教程:19.渲染控制器

本帖最后由 Cat_Anchor 于 2025-4-19 11:10 编辑

闲话:关于为什么这期教程隔了38天才发……
实际上我已经写到第32期(动态纹理)了,但我突然懒得每天把写好的教程发出来了,然后就莫名其妙地停了。不过我还要继续更新,不像某某说好的方块教程现在还没有出来。这几期的教程质量比较低,因为我想尽快使教程进入实体阶段。不过以后假期有时间了可能会重写(但是我不敢保证一定会)。
不管怎样,我会持续推送这个系列,直到第32期。目前还没有完结的打算,第32期以后我会讲解一些实战篇目,例如根据情境添加一些物品、方块和实体。以前我一直用理论层面写教程,第32期之后,我将会在实践中写。
好了,目前就是这样的更新计划。我不敢保证,但这个教程系列的总期数可能会达到 40。
如果以后 Mojang 开放了更多接口,例如新维度的接口和新状态效果的接口,我会在研究完之后在现有的基础上新出教程。
承接上一点,目前其实已经开放了一小部分的维度接口,可以在“行为包根目录/dimensions”下新建 overworld.json 然后输入特定代码来覆盖主世界维度的一些特性。但是以上功能仅仅可以实现数据驱动的主世界高度,而且限制很多。根据官方文档的说法,这个特性可能仅仅是为了创建一张虚空地图,或者让建筑党造很高的建筑,没别的用途。因此,我认为开放维度接口的可能性不大。关于状态效果,目前压根没有什么消息;更多的物品和方块接口更是遥遥无期。至于功能域,已经处于无人问津的地步了,那个特性自然也没有修复。





前言

上期,我们学习了动画。由于上上期留下的疑问,今天我们来学习渲染控制器。


https://klpbbs.com/static/image/hrline/line5.png


渲染控制器

打开资源包根目录,创建并打开 render_controllers 文件夹,这里用于存放渲染控制器。还要明确的是,如果是普通的实体,那么渲染控制器可以直接用 controller.render.default 来凑数。这个渲染控制器是内置的,十分方便。
下面来看这个默认的渲染控制器,了解最基本的模式。
{
"format_version": "1.8.0", // 格式版本。
"render_controllers": { // 可以在一个文件中定义很多个渲染控制器,但是没什么人这么做。
    "controller.render.default": { // 这里的键 controller.render.default 是这个渲染控制器的 ID。
      "geometry": "Geometry.default", // 指定要渲染的模型—— default 模型
      "materials": [
      {
          "*": "Material.default" // 指定材料为 default 材料
      }
      ],
      "textures": [
      "Texture.default" // 指定纹理为 default 纹理
      ]
    }
}
}
如果要有一些特殊的渲染,比如一个实体有不同的变种(variants),每个变种的纹理不一样,那就要用渲染控制器来控制每个变种到底该拥有什么纹理。
现在我放一段示例,让你们了解渲染控制器的结构。
{
"format_version": "1.8.0",
"render_controllers": {
    "controller.render.bear": { // 一个渲染控制器。controller.render.bear是这个渲染控制器的ID。
      "arrays": { // 这里决定了纹理(或模型、材质)有多少种。
      "textures": {
          "Array.skins": [ // Array.可以替换成你想要的,比如 Bear. 这样的。
            "Texture.default", // 这里的 default 就是资源包根目录下 entity 文件夹下实体文件中的 default,那里指定了 default 指向的路径。
            "Texture.angry", // 这里的 angry 就是资源包根目录下 entity 文件夹下实体文件中的 angry,那里指定了 angry 指向的路径,下同。
            "Texture.sleep",
            "Texture.sheared",
            "Texture.honey",
            "Texture.berries"
          ]
      }
      },
      "geometry": "Geometry.default", // 决定了模型。
      "materials": [ // 决定了材料。
      {
          "*": "Material.default"
      }
      ],
      "textures": [
      "Array.skins" // 注意,这里的 旨在查询实体的变种,根据返回的值,从上面的数组列表里找出对应的值去应用,如果上边将 Array. 改成了其他的,这里也要改。
      ]
    }
}
}这就是渲染控制器的示例文件。

渲染控制器还有一些其他字段,它们在每个渲染控制器的根目录下,与 textures materials geometry 等字段同级。以下是所有已知的字段。

part_visibility
指定模型的可见性。
"part_visibility": [
{ "goggles_up": "!query.property('minecraft:can_move') || !query.has_player_rider" },
{ "goggles": "query.property('minecraft:can_move') && query.has_player_rider" }
]
它是一个列表,列表中有若干个对象。每个对象中都有一个键值对,其中键是模型文件中定义的骨骼名称,值是用于决定那个骨骼是否渲染的 Molang 表达式。
goggles 是快乐恶魂挽具的护目镜,如果有玩家骑乘,护目镜就会放下,此时 goggles 骨骼显示而 goggles_up 骨骼消失。
query.property('minecraft:can_move') 是一个 Molang 查询函数。快乐恶魂有一个实体属性 minecraft:can_move,决定它是否可以自由移动。query.has_player_rider 也是 Molang 查询函数,返回是否有玩家骑乘它。&& 是逻辑与,两条件成立时成立。
"part_visibility": [
{ "Saddle": "query.is_saddled" },
{ "Bit*": "query.is_saddled" },
{ "Bridle": "query.is_saddled" },
{ "Reins*" : "query.is_saddled && query.has_rider" },
{ "Bag*" : false },
{ "MuleEar*" : false}
]
除此之外,我们可以使用通配符 * 指定骨骼名称。可见性也可以通过布尔值 true false 直接指定。

color
指定渲染的染色。
"color": {
"r": "variable.armor_texture_slot ? query.armor_color_slot(1, 0) : this",
"g": "variable.armor_texture_slot ? query.armor_color_slot(1, 1) : this",
"b": "variable.armor_texture_slot ? query.armor_color_slot(1, 2) : this",
"a": "variable.armor_texture_slot ? query.armor_color_slot(1, 3) : this"
}
它是一个对象,有四个属性 r g b a,分别指定红色分量、绿色分量、蓝色分量和不透明度。值可以填写 Molang 表达式。每个值的范围都是 。

uv_anim
指定 UV 映射的动画。修改此项可以实现动态实体纹理。
"uv_anim": {
"offset": [
    "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0",
    "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0"
],
"scale": [ 1.0, 1.0 ]
}
scale 是 UV 映射的缩放量。
offset 是一个数组,指定如何偏移 UV 映射。其中有两个值,指定 U 坐标的表达式和 V 坐标的表达式。这里,可以通过 query.life_time 获得一个随时间流逝而增加的值,其函数图像为标准的 y=x 图像。

以下是一个动态纹理的实现文件,适用于竖向排列的 64*16 的四帧纹理。
{
"format_version": "1.20.0",
"render_controllers": {
    "controller.render.entity": {
      "geometry": "Geometry.default",
      "textures": ["Texture.default"],
      "materials": [
      {
          "*": "Material.default" // 注意,这里使用的材料需要在材料定义文件中启用 USE_UV_ANIM。
      }
      ],
      "uv_anim": {
      "scale": ,
      "offset":
      }
    }
}
}
可以通过 Blockbench 的动态纹理功能生成此文件。

以下是启用了 USE_UV_ANIM 的材料。
[*]player_animated(推荐)
[*]conduit_wind(推荐)
[*]breeze_wind_charge
[*]breeze_wind
[*]experience_orb
[*]entity_beam
[*]beacon_beam
[*]charged_creeper
[*]player_spectator
建议使用前两个,不要使用后面那些,因为它们含有其他专为游戏特性设计的代码。

也可以考虑自定义一个材料,在资源包根目录 /materials/entity.material 中:
{
"materials": {
    "version": "1.0.0",
    "custom_material_name:entity_alphatest": {
      "+defines": [ "USE_UV_ANIM" ]
    }
}
}
其中 custom_material_name 可以替换为其他名称,使用在实体客户端定义文件中。

ignore_lighting
指定是否忽略环境光照,需要一个布尔值。
"ignore_lighting": true

light_color_multiplier
见于闪电苦力怕的渲染控制器文件中,用途未知。
"light_color_multiplier": 0.5

rebuild_animation_matrices
见于玩家的渲染控制器文件中,用途未知。
"rebuild_animation_matrices": true

overlay_color
指定覆盖的颜色,格式与 color 相同。
"overlay_color": {
"r": 1.0,
"g": 1.0,
"b": 1.0,
"a": 1.0
}


https://klpbbs.com/static/image/hrline/line1.png


总结


这一期,我们简单学完了渲染控制器。在第 32 期,你还会看到关于渲染控制器的巧妙运用。下一期,我们就要讲声音了。




第十八期 第十九期 第二十期

l m 123456 发表于 2023-12-23 11:30:44

仇恨控制器。

翠娥 发表于 2023-2-25 07:44:42

感谢分享
页: [1]
查看完整版本: 附加包教程:19.渲染控制器