• Forge论坛

导航页

  • 主页
  • 向文档做出贡献
  • 入门
    • 概述
    • 模组文件
    • 规划你的模组结构
    • 版本号
  • 核心概念
    • 注册表
    • 端位(Sides)
    • 事件
    • 模组生命周期
    • 资源
    • 国际化与本地化
  • 方块
    • 概述
    • 方块状态
  • 物品
    • 概述
    • BlockEntityWithoutLevelRenderer
  • 网络
    • 概述
    • SimpleImpl
    • 实体的同步
  • 方块实体
    • 概述
    • BlockEntityRenderer
  • 游戏特效
    • 粒子效果
    • 音效
  • 数据储存
    • Capabilities
    • Saved Data
    • 编解码器(Codecs)
  • 图形用户界面
    • 菜单(Menus)
    • 屏幕(Screens)
  • 渲染
    • 模型扩展
      • 概述
      • 根变换
      • 渲染类型
      • 部分可见度
      • 面数据
    • 模型加载器
      • 概述
      • 烘焙模型
      • 变换
      • 物品重载
  • 资源
    • 客户端资源(Assets)
      • 概述
      • 模型
        • 概述
        • 纹理色调
          • BlockColor/ItemColor
          • 创建颜色处理器
        • 物品属性
    • 服务端数据(Data)
      • 概述
      • 配方
        • 概述
        • 自定义配方
        • 原料
        • 非数据包配方
      • 战利品表
      • 全局战利品修改器
      • 标签
      • 进度
      • 条件性加载数据
  • 数据生成
    • 概述
    • 客户端资源(Assets)
      • 模型提供者
      • 语言提供者
      • 音效提供者
    • 服务端数据(Data)
      • 配方提供者
      • 战利品表提供者
      • 标签提供者
      • 进度提供者
      • 全局战利品修改器提供者
      • 数据包注册表对象提供者
  • 杂项功能
    • 配置
    • 键盘布局
    • 游戏测试
    • Forge更新检查器
    • 调试分析器
  • 进阶主题
    • 访问转换器
  • 向Forge做出贡献
    • 概述
    • Pull Request准则
  • 旧版本
    • 概述
    • 移植到当前版本

纹理色调

原版中的许多方块和物品会根据它们的位置或特性(如草)改变其纹理颜色。模型支持在面上指定“色调索引”,这是可以由BlockColor和ItemColor处理的整数。有关如何在原版模型中定义色调索引的信息,请参阅wiki。

BlockColor/ItemColor

这两个都是单方法接口。BlockColor接受一个BlockState、一个(可为空的)BlockAndTintGetter和一个(可为空的)BlockPos。ItemColor接受一个ItemStack。它们都采用一个int参数tintIndex,它是正在着色的面的色调索引。 它们都返回一个int,一个颜色乘数。这个int被视为4个无符号字节,即alpha、red、green和blue,按照从最高有效字节到最低有效字节的顺序。对于着色面上的每个像素,每个颜色通道的值是(int)((float) base * multiplier / 255.0),其中base是通道的原始值,multiplier是颜色乘数的关联字节。 请注意,方块不使用Alpha通道。例如,未着色的草纹理看起来是白色和灰色的。草的BlockColor和ItemColor返回颜色乘数,red和blue分量较低,但alpha和green分量较高(至少在温暖的生物群系中),因此当执行乘法时,绿色会被带出,红色/蓝色会减少。

如果物品继承自builtin/generated模型,则每个层(“layer0”、“layer1”等)都有与其层索引相对应的色调索引。

创建颜色处理器

BlockColor需要注册到游戏的BlockColors实例中。BlockColors可以通过RegisterColorHandlersEvent$Block获取,BlockColor可以通过#register注册。请注意,这不会导致给定方块的BlockItem被着色。BlockItem是物品,需要使用ItemColor进行着色。

@SubscribeEvent
public void registerBlockColors(RegisterColorHandlersEvent.Block event){
  event.register(myBlockColor, coloredBlock1, coloredBlock2, ...);
}

ItemColor需要注册到游戏的ItemColors实例中。ItemColors可以通过RegisterColorHandlersEvent$Item获取,ItemColor可以通过#register注册。此方法也被重载为接受Block,它只是将物品Block#asItem的颜色处理器注册为物品(即方块的BlockItem)。

@SubscribeEvent
public void registerItemColors(RegisterColorHandlersEvent.Item event){
  event.register(myItemColor, coloredItem1, coloredItem2, ...);
}
Built with MkDocs using a custom theme. Hosted by Read the Docs.
Enable Dark Theme