森罗万象
教程
OptiFine文档
Blockbench文档
论坛版 (opens new window)
下载示例 (opens new window)
教程
OptiFine文档
Blockbench文档
论坛版 (opens new window)
下载示例 (opens new window)
  • 准备
  • 基础
  • 动态纹理(前篇)
  • 模型和渲染
  • 额外的资源文件
  • 音效
  • 语言和文字

  • OptiFine与MCPatcher
  • CTM
    • CTM方法
    • 枯山水——CTM
    • 枯山水——随机纹理
    • 枯山水——生物群系
    • 枯山水——优先级
    • 简化CTM方法
    • 海鼠壁——竖向连接
    • 海鼠壁——横向连接
    • 砂砾——重复图案
    • 砂砾——覆盖纹理
      • 为砂砾制作覆盖纹理
      • 属性文件的优先级
      • 草方块的过渡
    • 卢恩符文——覆盖方法的变体
    • 杂项——补充
  • CIT
  • CEM
  • 动态纹理(后篇)
  • 光与色

  • 环境
  • GUI
  • PBR纹理
  • 着色器/光影
  • 附录

# 砂砾——覆盖纹理

本节前置知识:

​ tintindex

​ 渲染类型

覆盖方法乍一看并不容易有直观理解,我们首先以官方的范本为例,制作一个覆盖纹理,看看效果是什么样的。

img

# 为砂砾制作覆盖纹理

我们要为之前制作的砂砾设置覆盖纹理:

image-20200710091059701

将官方的范本裁切开,放到ctm文件夹下,并新建gravel_overlay.properties

gravel_overlay.properties

method=overlay
matchBlocks=minecraft:gravel
tiles=0-16

image-20200710093307312

很遗憾,什么都没发生!

# 属性文件的优先级

我们已经为砂砾设置了方法为repeat的properties文件,所以在这里产生了冲突。

在枯山水——优先级章节我们已经提到,可以通过修改属性文件的路径,路径排在前面的文件具有更高的优先级,在log文件中,我们也可以清晰看到属性文件的排序:

image-20200710093935385

那么问题来了,既然我已经将gravel_overlay.properties设置为第一个加载,为什么它还是被dirt_stone.properties(砂砾——重复图案小节砂砾的属性文件)覆盖了?

这是因为matchTiles具有绝对优先级,任何macthTiles的属性文件都会在matchBlocks的属性文件之前加载。我们在dirt_stone.properties里设置的是macthTiles,而这里我们设置的是matchBlocks。

于是我们修改一下属性文件:

gravel_overlay.properties

method=overlay
matchTiles=minecraft:gravel
tiles=0-16

效果:

image-20200710094616204

至此我们可以看出覆盖纹理出现在了砂砾和其他方块的交界处,适合用于方块间的过渡。

# 草方块的过渡

因为覆盖纹理是出现在砂砾上,那覆盖纹理本身应该是草皮的纹理,否则无法实现砂砾和草方块之间的过渡。

为什么我说覆盖纹理应该是草皮的纹理而不是砂砾和草皮各占一部分?

这是因为overlay纹理会在cutout_mipped层渲染,这一层是支持透明纹理的,而且这一层会覆盖在solid也就是普通渲染层的上面,形象地说就是草皮蔓延了一部分覆盖在了砂砾上方。

提示

还不知道渲染层是什么可以看看这一节哦

了解了这一点,我们就可以根据模板,制作草皮覆盖层的纹理了。

闭着眼瞎画的纹理:

image-20200710101824568

我们看到虽然体现出草皮和砂砾的过渡了,但是草皮的颜色没了。

image-20200710101918143

我们需要给属性文件加上tintIndex和tintBlock:

提示

不了解tintIndex可以看看这个小节。

gravel_overlay.properties

method=overlay
matchTiles=minecraft:gravel
tiles=0-16
# 默认值为-1,也就是不使用染色
tintIndex=0
# 使用草方块的染色方式
tintBlock=minecraft:grass

很好,我们已经实现草方块和砂砾的过渡了!

image-20200710103126832

但现在砂砾不管遇到什么方块都会显示覆盖草方块的样子。

image-20200710103331939

所以要加上connectBlocks或者connectTiles加以限制,我们选用connectTiles:

gravel_overlay.properties

method=overlay
matchTiles=minecraft:gravel
tiles=0-16
connectTiles=minecraft:grass_block_top
tintIndex=0
tintBlock=minecraft:grass

我们看到现在只有连接草方块时,砂砾才显示草方块的覆盖纹理:

image-20200710103611967

既然如此,我们为什么不为其他方块也加上草方块的覆盖纹理呢?

gravel_overlay.properties

method=overlay
# 想加多少加多少!
matchTiles=gravel sand red_sand stone
tiles=0-16
connectTiles=minecraft:grass_block_top
tintIndex=0
tintBlock=minecraft:grass

效果:

image-20200710104052053

现在看来,这个属性文件不是属于gravel的,反而是属于grass的,有了这个属性文件,可以让草方块蔓延到任何固体方块上。

← 砂砾——重复图案 卢恩符文——覆盖方法的变体 →