ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MCreator 流体着色类型(Tint Type)详解:基于生物群系的液体着色原理与最佳实践

MCreator 流体着色类型(Tint Type)详解:基于生物群系的液体着色原理与最佳实践
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】MCreator

MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

MCreator 的流体(Fluid)元素提供"着色类型"(Tint Type)选项,可让自定义液体像原版的草、树叶和水一样,根据所处生物群系动态改变渲染颜色。本文以 德语帮助文档(及同源 英文默认文档)为骨架,结合仓库中流体元素的数据模型、GUI 定义与 NeoForge 代码生成模板,完整讲解着色类型的全部可选值、底层颜色计算逻辑、灰度纹理最佳实践,以及它对自动生成纹理的影响。读完本文,你将能精准配置出"随生物群系变色"的液体,并理解生成代码中每个选项背后的实际取值来源。

一、什么是流体着色类型

在 MCreator 中创建流体元素时,"着色类型"决定引擎对流体纹理施加何种色调(tint)。其核心行为是:

该选项会基于生物群系颜色(biome colors)对流体应用着色,效果与原版中草、树叶、水随生物群系变色的机制相同。

这意味着,当你把流体设置成"草"或"水"着色类型后,同一种液体在森林、平原、沙漠等不同生物群系中会呈现出不同的颜色——不是美术贴图不同,而是运行时由着色器根据当前位置的生物群系数据实时叠加颜色。

从数据模型看,该属性定义在 Fluid.java 中,通过@LimitedOptions注解限定为一组固定枚举值,并通过isFluidTinted()方法(return !"No tint".equals(tintType),见 Fluid.java)判断该流体是否启用了着色。默认值为"No tint"(不着色),即新创建的流体默认不启用该功能。

二、可用的着色类型及适用场景

根据 Fluid.java 中@LimitedOptions的声明,流体着色类型共有以下 11 个可选值:

可选值效果说明参考对象
No tint不着色,使用纹理原始颜色默认值
Grass使用生物群系的草颜色草方块
Foliage使用生物群系的树叶颜色树叶
Dry foliage使用干燥植物/枯叶颜色干草丛
Birch foliage使用固定白桦树叶颜色白桦树
Spruce foliage使用固定云杉(常绿)树叶颜色云杉树
Default foliage使用默认树叶颜色橡树树叶
Water使用生物群系的水体颜色原版水
Sky使用生物群系的天空颜色天空
Fog使用生物群系的雾颜色雾
Water fog使用生物群系的水下雾颜色水下雾

其中Grass、Foliage、Water属于"随生物群系动态变化"的类型(适合表现自然水体);Birch foliage、Spruce foliage、Default foliage属于固定颜色类型(结果稳定,不随群系变化);Sky、Fog、Water fog则把流体颜色与当前群系的天空/雾色绑定,可用于制作具有环境氛围感的特殊液体。

值得一提的是,这一套枚举并非流体独有——Block.java 与 Plant.java 中定义了完全相同的着色类型集合,因此你可以在方块、植物、流体之间保持一致的着色风格。

三、在 GUI 中配置着色类型

在流体元素的编辑界面中,"着色类型"以下拉框形式出现在渲染设置区域。相关实现位于 FluidGUI.java:

  • 下拉框组件由ComponentFromAnnotation.options(Fluid.class, "tintType")自动创建(FluidGUI.java),直接读取上文Fluid类中@LimitedOptions注解声明的枚举值;
  • 加载元素时调用tintType.setSelectedItem(fluid.tintType)回显已保存的值(FluidGUI.java);
  • 保存元素时通过fluid.tintType = (String) tintType.getSelectedItem()写回数据模型(FluidGUI.java)。

在简体中文界面中,该控件显示为"着色类型:",对应的本地化文案定义于 texts_zh_CN.properties。操作路径为:新建或打开"Fluid"元素 → 在渲染设置分组中找到"着色类型"下拉框 → 从 11 个候选中选择一项 → 保存并生成代码。

四、生成代码的底层原理:getTintColor 双方法

启用任意非No tint着色类型后,MCreator 的代码生成器会在流体类型(FluidType)客户端扩展中生成两个getTintColor方法,二者共同完成"静态底色 + 动态群系色"的渲染控制。以 NeoForge 1.21.1 生成器模板 fluidtype.java.ftl 为例:

**第一个方法(无参)**返回一个固定的 ARGB 颜色值,作为流体渲染的静态色调。生成逻辑如下(#if data.tintType == ...条件分支):

着色类型生成的静态颜色值
Grass-6506636
Foliage/Default foliage-12012264
Birch foliage-8345771
Spruce foliage-10380959
Dry foliage10710342(1.21.1 无此类型,改用常量替代)
Water-13083194
Sky-8214273
Fog-4138753
其他(含Water fog)-16448205

**第二个方法(带FluidState state, BlockAndTintGetter world, BlockPos pos参数)**则逐位置查询生物群系数据,实现真正的"随群系变色":

  • Grass→BiomeColors.getAverageGrassColor(world, pos)
  • Foliage→BiomeColors.getAverageFoliageColor(world, pos)
  • Default foliage→FoliageColor.getDefaultColor()
  • Birch foliage→FoliageColor.getBirchColor()
  • Spruce foliage→FoliageColor.getEvergreenColor()
  • Dry foliage→ 常量10710342(模板注释明确说明"该着色类型在 1.21.1 中不存在,使用常量值代替")
  • Water→BiomeColors.getAverageWaterColor(world, pos)
  • Sky→Minecraft.getInstance().level.getBiome(pos).value().getSkyColor()
  • Fog→Minecraft.getInstance().level.getBiome(pos).value().getFogColor()
  • Water fog(模板中的else分支)→Minecraft.getInstance().level.getBiome(pos).value().getWaterFogColor()

所有动态颜色最终通过| 0xFF000000强制补齐不透明 alpha 通道,保证着色后的液体不会出现半透明色带异常。

版本差异提示:在较新的 NeoForge 26.3.x 生成器模板 fluidtype_client.java.ftl 中,实现改为直接使用BiomeColors.getAverageDryFoliageColor(world, pos)与FoliageColor.FOLIAGE_DEFAULT、FOLIAGE_BIRCH、FOLIAGE_EVERGREEN等常量,Dry foliage在 26.3.x 中已拥有专属的生物群系颜色 API,无需再使用常量替代。

从模板外层还能看到:只有当data.isFluidTinted()为真时,整个getTintColor相关代码块才会被生成(fluidtype.java.ftl);而isFluidTinted()又通过extendsFluidAttributes()联动控制流体属性扩展逻辑(Fluid.java)。因此,选择No tint的流体生成代码更精简,运行时也省去了逐方块的颜色查询开销。

五、最佳实践:使用灰度纹理

原文档特别强调:为获得最佳效果,流体应使用灰度(grayscale)纹理。

这是 Minecraft 生物群系着色机制的内在要求。着色器的工作方式是"纹理颜色 × 着色颜色"的乘法混合:若纹理本身已经带有明显颜色,乘以群系色后会产生难以预料的色偏;而灰度纹理只携带明暗信息(白色为最亮、黑色为最暗),再与生物群系颜色相乘,就能得到"明暗细节保留、色相完全受控"的理想效果——这与你为草方块、树叶准备灰度贴图再交给群系着色的做法完全一致。

实操建议:

  • 在像素画编辑器中把流体的"静态纹理"(Still Texture)与"流动纹理"(Flowing Texture)绘制为灰度图,只保留亮度层次(如深浅不一的水波纹、气泡等);
  • 随后在"着色类型"中选择目标群系色(如Water表现海洋、Grass表现绿色液体);
  • 若希望液体在任意群系都呈现完全一致的颜色,则保留No tint并直接在纹理中绘制最终颜色。

六、着色类型对自动生成纹理的影响

原文档同时指出:着色类型也会影响自动生成的桶(bucket)纹理。

从源码可以印证这一联动关系。MCreator 在 MinecraftImageGenerator.java 中通过generateFluidBucketIcon(ImageIcon fluid)自动生成流体桶的图标:先将流体纹理缩放裁剪为 32×32,再与bucket_mask遮罩做透明度蒙版,最后叠加在bucket_base桶底座之上,得到最终桶图标。同时,流体元素的预览图也直接取自静态纹理(ImageUtils.resizeAndCrop(textureStill.getImage(TextureType.BLOCK), 32),见 Fluid.java)。

因此,虽然着色本身发生在运行时渲染阶段,但当你切换着色类型时,MCreator 会在生成工作区资源时重新计算与流体外观相关的自动生成纹理,确保方块预览、桶图标与游戏内最终渲染效果保持一致。建议在切换着色类型后重新生成并检查桶图标,确认其在对应生物群系中的观感符合预期。

七、使用要点与常见陷阱

  1. 默认不着色:新流体默认No tint,需要主动选择其他类型才能获得群系变色效果;
  2. 颜色来源分清:Grass/Foliage/Water是动态群系色,Birch / Spruce / Default foliage是固定常量色,Sky / Fog / Water fog绑定环境色——按表现需求而非名称直觉选择;
  3. 纹理灰度化:启用着色前务必检查纹理是否为灰度图,否则容易出现颜色脏污或不可控偏色;
  4. 版本兼容:Dry foliage在 1.21.1 生成器中以常量值替代(生成代码与 fluidtype.java.ftl 注释一致),而在 26.3.x 中已支持原生群系颜色 API;
  5. 与方块/植物一致:流体、方块、植物共享同一套着色类型枚举,可通过统一设置让液体与其"容器"方块(如水池)的着色风格保持一致。

通过合理组合"着色类型 + 灰度纹理",你可以在不改动任何贴图的情况下,让自定义液体像原版水与草一样自然地融入 MCreator 生成的任意生物群系世界。

  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】MCreator

MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

相关推荐

上一篇:res-downloader 视频解密下载教程:把微信视频号加密视频变成能播的完整流程
下一篇:Penrose字体加载策略:确保数学符号正确显示的跨平台方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进