材质
expert
WARNING
材质系统不适合胆小者。请做好应对游戏崩溃、内容日志报错和长时间加载的准备。
概述
材质用于指定渲染游戏不同部分的着色器,以及着色器应考虑的各个元素的状态和设置。 目前游戏中大多数内容都硬编码使用特定材质,无法分配新材质。改变这些元素渲染方式的唯一方法是直接编辑其材质(可能会对其他部分产生意外影响)或创建新的着色器(这是Mojang不再官方支持的旧实验性功能)。唯一允许分配或移除默认/自定义材质的元素是实体和粒子。
如果您不打算深入研究细节,可以在此处找到材质预设文档。
语法与结构
大多数材质会继承先前定义材质的设置,并在此基础上进行扩展。其格式如下:
RP/materials/name.material
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"
json
"entity_nocull:entity":{
"+states":[
"DisableCulling"
]
}最终可追溯至"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版本之前不存在此问题。
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"]
}
}
}


