Skip to content

材质 Material

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

WARNING

材质系统不适合心理承受能力较弱的使用者。请做好应对潜在崩溃、内容日志错误和漫长加载时间的准备。

概述

材质用于指定渲染游戏不同部分的着色器,以及着色器在处理每个元素时应考虑的状态和设置。目前游戏中的大多数内容都硬编码使用特定材质,无法分配新的材质。要改变这些元素的渲染方式,只能直接修改原有材质(可能会对其他部分产生意外影响)或创建新的着色器(这是Mojang已不再官方支持的旧实验性功能)。唯一可以分配或移除默认/自定义材质的元素是实体和粒子。

如果您不打算深入探索材质系统的细节,可以在此处找到预设材质文档

语法与结构

多数材质通过继承先前定义的材质设置并进行扩展来实现功能。其基本格式如下:

json
{
	"materials": {
		"version": "1.0.0",
		"<新材质ID>:<基础材质ID>": {
    		<定义、状态及其他设置>
		}
	}
}

WARNING

虽然看起来相似,但请勿将材质格式文件与包中的其他文件混淆。材质系统中不使用命名空间。

部分材质文件包含复杂的继承树结构。例如,几乎所有默认实体使用的材质最终都继承自entity.material文件中的entity_static材质。以当前村民使用的材质为例:

json
"villager_v2_masked:entity_multitexture_masked": {
    "depthFunc": "LessEqual"
}

可以看出该材质名为villager_v2_masked,继承自entity_multitexture_masked材质。在该文件中向上追溯,可以发现entity_multitexture_masked继承自entity_alphatest并扩展了设置:

json
"entity_multitexture_masked:entity_alphatest":{
    "+defines":[
        "MASKED_MULTITEXTURE"
    ],
    "+samplerStates":[
        {
            "samplerIndex":0,
            "textureWrap":"Clamp"
        },
        {
            "samplerIndex":1,
            "textureWrap":"Clamp"
        }
    ]
}

继续追溯entity_alphatest可发现其继承自entity_nocull

json
"entity_alphatest:entity_nocull":{
    "+defines":[
        "ALPHA_TEST"
    ],
    "+samplerStates":[
        {
            "samplerIndex":1,
            "textureWrap":"Repeat"
        }
    ],
    "msaaSupport":"Both"
}

entity_nocull又继承自基础entity材质:

json
"entity_nocull:entity":{
    "+states":[
        "DisableCulling"
    ]
}

最终entity材质继承自entity_static

json
"entity:entity_static":{
    "+defines":[
        "USE_OVERLAY"
    ],
    "msaaSupport":"Both"
}

entity_static材质没有冒号后的继承对象,表明这是继承链的终点:

json
"entity_static":{
    "vertexShader":"shaders/entity.vertex",
    "vrGeometryShader":"shaders/entity.geometry",
    "fragmentShader":"shaders/entity.fragment",
    "vertexFields":[
        {
            "field":"Position"
        },
        {
            "field":"Normal"
        },
        {
            "field":"UV0"
        }
    ],
    "variants":[
        {
            "skinning":{
                "+defines":[
                    "USE_SKINNING"
                ],
                "vertexFields":[
                    {
                        "field":"Position"
                    },
                    {
                        "field":"BoneId0"
                    },
                    {
                        "field":"Normal"
                    },
                    {
                        "field":"UV0"
                    }
                ]
            }
        },
        {
            "skinning_color":{
                "+defines":[
                    "USE_SKINNING",
                    "USE_OVERLAY"
                ],
                "+states":[
                    "Blending"
                ],
                "vertexFields":[
                    {
                        "field":"Position"
                    },
                    {
                        "field":"BoneId0"
                    },
                    {
                        "field":"Color"
                    },
                    {
                        "field":"Normal"
                    },
                    {
                        "field":"UV0"
                    }
                ]
            }
        }
    ],
    "msaaSupport":"Both",
    "+samplerStates":[
        {
            "samplerIndex":0,
            "textureFilter":"Point"
        }
    ]
}

1.16.100+ 注意事项

使用自定义材质的用户请注意!

1.16.100版本后,自定义材质继承将不再有效并会导致内容日志错误。解决方法是使用前缀和材质名称直接定义完整材质。

该问题在1.16.100版本前不存在:

json
{
    "materials": {
        "version": "1.0.0",
        "prefix:window_glass:entity": { // 现在会触发内容日志错误
            "+states": [
                "Blending"
            ],
            "defines": [
                "ENABLE_FOG",
                "ENABLE_LIGHT",
                "USE_ONLY_EMISSIVE"
            ]
        },
        "prefix:window_glass:": { // 修正错误的方法,注意:可能需要重新定义旧继承值
            "+states": [
                "Blending"
            ],
            "defines": [
                "ENABLE_FOG",
                "ENABLE_LIGHT",
                "USE_ONLY_EMISSIVE"
            ]
        }
    }
}