森罗万象
教程
OptiFine文档
Blockbench文档
论坛版 (opens new window)
下载示例 (opens new window)
教程
OptiFine文档
Blockbench文档
论坛版 (opens new window)
下载示例 (opens new window)
  • 准备
  • 基础
  • 动态纹理(前篇)
  • 模型和渲染
    • 建模相关教程
    • 阴影
    • 环境光遮蔽
    • 面剔除
    • tintindex
    • 不透明方块
    • 渲染类型
    • 物品展示框——附加模型包
    • 物品标签——添加更多物品
    • 蝶舞——盆栽艺术
  • 额外的资源文件
  • 音效
  • 语言和文字

  • OptiFine与MCPatcher
  • CTM
  • CIT
  • CEM
  • 动态纹理(后篇)
  • 光与色

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

# 环境光遮蔽

以下内容为这篇Blog (opens new window)的译文节选,完整译文 (opens new window)发布在mcbbs。

环境光遮蔽(Ambient Occlusion)是一种基于附近的方块计算表面的光照的方法。这儿 (opens new window)有Minecraft如何实现这个方法的简介。简而言之,对于每个顶点,计算出三个毗邻的方块和接触这个面的方块的平均光照强度。在下方的例子中,对于这个用红色圈起来的顶点,是以白色显示的这三个方块和这个面正上方的方块(未显示)的平均亮度。如果这四个方块都是透明的,”环境光遮蔽“光照强度将会是1.0。每个不透明方块都会降低顶点接收到的光照 - 如果四个方块都是不透明的那么这个强度将会是0.2。”环境光遮蔽“值会与顶点的颜色乘数相乘。顶点的混合亮度被计算为四个相邻方块的平均值。(还有一些其他有关对角方块是否被计算在内的细节,但是你已经知道了基本的思路)在绘制面时,OpenGL提供了平滑,所以环境光遮蔽在不同顶点上的产生的阴影在整个平面上被平滑了。

img

Minecraft的方块模型有一个"ambientocclusion"选项,默认为true。

反常识的一点是,如果设置了"parent",则其父模型的ambientocclusion标签会覆盖该模型的ambientocclusion标签。代码实现如下。

net.minecraft.client.renderer.model.BlockModel(1.15.2)

public boolean isAmbientOcclusion() {
    return this.parent != null ? this.parent.isAmbientOcclusion() : this.ambientOcclusion;
}

提示

通常情况下,一个非完整方块,我们要考虑一下是否将环境光遮蔽设置为false,例如原版的例子template_torch.json,直立的火把。上一节涉及的shade在这里也得到了体现。

Blockbench中设置环境光遮蔽的方法:文件——项目——环境光遮蔽。

template_torch.json

{
    "ambientocclusion": false,
    "textures": {
        "particle": "#torch"
    },
    "elements": [
        {   
            "from": [ 7, 0, 7 ],
            "to": [ 9, 10, 9 ],
            "shade": false,
            "faces": {
                "down": { "uv": [ 7, 13, 9, 15 ], "texture": "#torch" },
                "up":   { "uv": [ 7,  6, 9,  8 ], "texture": "#torch" }
            }
        },
        {   
            "from": [ 7, 0, 0 ],
            "to": [ 9, 16, 16 ],
            "shade": false,
            "faces": {
                "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" },
                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" }
            }
        },
        {   
            "from": [ 0, 0, 7 ],
            "to": [ 16, 16, 9 ],
            "shade": false,
            "faces": {
                "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" },
                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" }
            }
        }
    ]
}

← 阴影 面剔除 →