开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

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

 发表于 2023-2-25 07:35:54 来自手机|显示全部楼层|阅读模式 IP:天津
本帖最后由 Cat_Anchor 于 2025-4-19 11:10 编辑

闲话:



前言
上期,我们学习了动画。由于上上期留下的疑问,今天我们来学习渲染控制器。
渲染控制器
打开资源包根目录,创建并打开 render_controllers 文件夹,这里用于存放渲染控制器。还要明确的是,如果是普通的实体,那么渲染控制器可以直接用 controller.render.default 来凑数。这个渲染控制器是内置的,十分方便。
下面来看这个默认的渲染控制器,了解最基本的模式。
  1. {
  2.   "format_version": "1.8.0", // 格式版本。
  3.   "render_controllers": { // 可以在一个文件中定义很多个渲染控制器,但是没什么人这么做。
  4.     "controller.render.default": { // 这里的键 controller.render.default 是这个渲染控制器的 ID。
  5.       "geometry": "Geometry.default", // 指定要渲染的模型—— default 模型
  6.       "materials": [
  7.         {
  8.           "*": "Material.default" // 指定材料为 default 材料
  9.         }
  10.       ],
  11.       "textures": [
  12.         "Texture.default" // 指定纹理为 default 纹理
  13.       ]
  14.     }
  15.   }
  16. }
复制代码

如果要有一些特殊的渲染,比如一个实体有不同的变种(variants),每个变种的纹理不一样,那就要用渲染控制器来控制每个变种到底该拥有什么纹理。
现在我放一段示例,让你们了解渲染控制器的结构。
  1. {
  2.   "format_version": "1.8.0",
  3.   "render_controllers": {
  4.     "controller.render.bear": { // 一个渲染控制器。controller.render.bear是这个渲染控制器的ID。
  5.       "arrays": { // 这里决定了纹理(或模型、材质)有多少种。
  6.         "textures": {
  7.           "Array.skins": [ // Array.可以替换成你想要的,比如 Bear. 这样的。
  8.             "Texture.default", // 这里的 default 就是资源包根目录下 entity 文件夹下实体文件中的 default,那里指定了 default 指向的路径。
  9.             "Texture.angry", // 这里的 angry 就是资源包根目录下 entity 文件夹下实体文件中的 angry,那里指定了 angry 指向的路径,下同。
  10.             "Texture.sleep",
  11.             "Texture.sheared",
  12.             "Texture.honey",
  13.             "Texture.berries"
  14.           ]
  15.         }
  16.       },
  17.       "geometry": "Geometry.default", // 决定了模型。
  18.       "materials": [ // 决定了材料。
  19.         {
  20.           "*": "Material.default"
  21.         }
  22.       ],
  23.       "textures": [
  24.         "Array.skins[q.variant]" // 注意,这里的 [q.variant] 旨在查询实体的变种,根据返回的值,从上面的数组列表里找出对应的值去应用,如果上边将 Array. 改成了其他的,这里也要改。
  25.       ]
  26.     }
  27.   }
  28. }
复制代码
这就是渲染控制器的示例文件。

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

part_visibility
指定模型的可见性。
  1. "part_visibility": [
  2.   { "goggles_up": "!query.property('minecraft:can_move') || !query.has_player_rider" },
  3.   { "goggles": "query.property('minecraft:can_move') && query.has_player_rider" }
  4. ]
复制代码

它是一个列表,列表中有若干个对象。每个对象中都有一个键值对,其中键是模型文件中定义的骨骼名称,值是用于决定那个骨骼是否渲染的 Molang 表达式。
goggles 是快乐恶魂挽具的护目镜,如果有玩家骑乘,护目镜就会放下,此时 goggles 骨骼显示而 goggles_up 骨骼消失。
query.property('minecraft:can_move') 是一个 Molang 查询函数。快乐恶魂有一个实体属性 minecraft:can_move,决定它是否可以自由移动。query.has_player_rider 也是 Molang 查询函数,返回是否有玩家骑乘它。&& 是逻辑与,两条件成立时成立。
  1. "part_visibility": [
  2.   { "Saddle": "query.is_saddled" },
  3.   { "Bit*": "query.is_saddled" },
  4.   { "Bridle": "query.is_saddled" },
  5.   { "Reins*" : "query.is_saddled && query.has_rider" },
  6.   { "Bag*" : false },
  7.   { "MuleEar*" : false}
  8. ]
复制代码

除此之外,我们可以使用通配符 * 指定骨骼名称。可见性也可以通过布尔值 true false 直接指定。

color
指定渲染的染色。
  1. "color": {
  2.   "r": "variable.armor_texture_slot ? query.armor_color_slot(1, 0) : this",
  3.   "g": "variable.armor_texture_slot ? query.armor_color_slot(1, 1) : this",
  4.   "b": "variable.armor_texture_slot ? query.armor_color_slot(1, 2) : this",
  5.   "a": "variable.armor_texture_slot ? query.armor_color_slot(1, 3) : this"
  6. }
复制代码

它是一个对象,有四个属性 r g b a,分别指定红色分量、绿色分量、蓝色分量和不透明度。值可以填写 Molang 表达式。每个值的范围都是 [0.0, 1.0]。

uv_anim
指定 UV 映射的动画。修改此项可以实现动态实体纹理。
  1. "uv_anim": {
  2.   "offset": [
  3.     "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0",
  4.     "(query.is_shield_powered) ? (Math.floor(query.life_time * 20.0) + query.frame_alpha) * 0.01 : 0.0"
  5.   ],
  6.   "scale": [ 1.0, 1.0 ]
  7. }
复制代码

scale 是 UV 映射的缩放量。
offset 是一个数组,指定如何偏移 UV 映射。其中有两个值,指定 U 坐标的表达式和 V 坐标的表达式。这里,可以通过 query.life_time 获得一个随时间流逝而增加的值,其函数图像为标准的 y=x 图像。

以下是一个动态纹理的实现文件,适用于竖向排列的 64*16 的四帧纹理。
  1. {
  2.   "format_version": "1.20.0",
  3.   "render_controllers": {
  4.     "controller.render.entity": {
  5.       "geometry": "Geometry.default",
  6.       "textures": ["Texture.default"],
  7.       "materials": [
  8.         {
  9.           "*": "Material.default" // 注意,这里使用的材料需要在材料定义文件中启用 USE_UV_ANIM。
  10.         }
  11.       ],
  12.       "uv_anim": {
  13.         "scale": [1, 1],
  14.         "offset": [0, "Math.mod(Math.floor(q.life_time * 10), 1)"]
  15.       }
  16.     }
  17.   }
  18. }
复制代码

可以通过 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 中:
    1. {
    2.   "materials": {
    3.     "version": "1.0.0",
    4.     "custom_material_name:entity_alphatest": {
    5.       "+defines": [ "USE_UV_ANIM" ]
    6.     }
    7.   }
    8. }
    复制代码

    其中 custom_material_name 可以替换为其他名称,使用在实体客户端定义文件中。

    ignore_lighting
    指定是否忽略环境光照,需要一个布尔值。
    1. "ignore_lighting": true
    复制代码


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


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


    overlay_color
    指定覆盖的颜色,格式与 color 相同。
    1. "overlay_color": {
    2.   "r": 1.0,
    3.   "g": 1.0,
    4.   "b": 1.0,
    5.   "a": 1.0
    6. }
    复制代码
  • 总结
    这一期,我们简单学完了渲染控制器。在第 32 期,你还会看到关于渲染控制器的巧妙运用。下一期,我们就要讲声音了。


    苦力怕论坛,感谢有您~
     发表于 2023-12-23 11:30:44 来自手机|显示全部楼层 IP:安徽省
    评论复审中...编号:10011564
    3#2023-12-23 11:30:44回复收起回复
    苦力怕论坛,感谢有您~
    回复支持

    使用道具举报

     发表于 2023-2-25 07:44:42 来自手机|显示全部楼层 IP:江西省
    评论复审中...编号:5887076
    2#2023-2-25 07:44:42回复收起回复
    苦力怕论坛,感谢有您~

    本版积分规则

    本站
    关于我们
    联系我们
    坛史纲要
    官方
    哔哩哔哩
    技术博客
    下载
    网易版
    安卓版
    JAVA
    反馈
    意见建议
    教程中心
    更多
    捐助本站
    QQ群
    QQ群

    QQ群

    访问手机版

    访问手机版

    手机版|小黑屋|系统状态|klpbbs.com

    | 由 木韩网络 提供支持 | GMT+8, 2026-6-13 20:58

    声明:本站与Mojang以及微软公司没有从属关系

    Powered by Discuz! X3.4