材质¶
材质(Material)是Minecraft基岩版资源包中用于定义渲染阶段配置的资源类型。材质决定模型在渲染时使用的着色器、渲染状态和顶点输入布局,是纹理与几何体能够被正确绘制的关键环节。
概述¶
材质定义文件位于资源包的materials/目录,扩展名通常为.material。实体和附着物不会直接写入底层着色器路径,而是先在客户端实体定义中声明材质短名称,再由渲染控制器通过Material.前缀进行选择。
材质本身不描述“使用哪张纹理”,而是描述“如何渲染”。纹理选择通常由客户端实体定义与渲染控制器完成。
主要作用¶
材质主要用于统一描述以下内容:
- 着色器入口与渲染变种。
- 渲染状态,例如混合、剔除、深度写入。
- 顶点字段布局与采样器状态。
- 某些渲染功能开关,例如覆盖色或UV动画相关定义。
与渲染控制器的关系¶
渲染控制器中的materials字段负责将骨骼映射到材质短名称。引擎渲染骨骼时,会先匹配到对应材质,再结合纹理与几何体完成最终绘制。因此,材质是渲染控制器资源组合链中的核心节点之一。
实体局部发光、半透明等效果通常同时依赖“正确的材质类型”与“正确的纹理内容”。仅替换纹理而不调整材质,往往无法得到预期结果。
旧版着色器文件¶
RenderDragon不兼容
本节所述的着色器机制与RenderDragon渲染引擎不兼容。在1.16.200及以后版本的Windows和主机设备,以及1.18.30及以后版本的其他设备上,此类自定义着色器均无法生效。
在RenderDragon引入之前,.material文件可以通过vertexShader和fragmentShader字段直接引用自定义着色器源文件,实现光影级别的视觉效果修改。着色器文件分为glsl/和hlsl/两个目录;要在所有设备上生效,需同时用两种语言编写。
.material文件中与着色器相关的通用字段如下:
| 字段 | 说明 |
|---|---|
vertexShader | 顶点着色器路径,相对于hlsl/或glsl/目录,HLSL文件会自动追加.hlsl后缀 |
fragmentShader | 片段着色器路径,规则与vertexShader相同 |
vertexFields | 传递给顶点着色器的字段数组,通常从原版材质复制 |
variants | 材质变种定义数组 |
+defines | 向着色器源码追加的#define指令数组 |
-defines | 从继承材质中移除的#define指令数组 |
+states | 启用的渲染状态数组,如Blending、DisableDepthWrite |
+samplerStates | 纹理采样方式定义数组,包含samplerIndex和textureFilter等字段 |
msaaSupport | 多重采样抗锯齿支持设置 |
blendSrc | 颜色源混合因子 |
blendDst | 颜色目标混合因子 |
材质支持继承,使用冒号语法(如entity_alpha:entity_base)声明父材质,子材质会继承父材质的所有字段并按需覆盖或追加。
材质系统在不同渲染时代存在明显差异。旧版社区部分可行做法在RenderDragon渲染路径下可能失效,或仅在特定版本、特定平台生效。维护跨版本内容时,应始终以目标版本的内容日志和实际设备测试结果为准。
质量分级控制文件¶
在旧版着色器系统中,materials/目录可包含以下质量分级配置文件:
- :file-type-sad.json:{ title="" }json
- 低画质分级的材质覆盖定义,对应游戏画面设置中的"低"档位。
- :file-type-fancy.json:{ title="" }json
- 高画质分级的材质覆盖定义,对应游戏画面设置中的"高"或以上档位。
- :file-type-common.json:{ title="" }json
- 所有质量等级共用的通用材质定义。
+states可选值¶
+states字段用于启用渲染状态,其可选值如下:
| 值 | 说明 |
|---|---|
EnableAlphaToCoverage | 启用Alpha覆盖度(MSAA环境下将Alpha值映射为覆盖率) |
Blending | 启用Alpha混合 |
DisableAlphaWrite | 禁止写入Alpha通道 |
DisableColorWrite | 禁止写入颜色通道 |
DisableRGBWrite | 禁止写入RGB通道(允许写入Alpha) |
DisableDepthWrite | 禁止写入深度缓冲 |
DisableDepthTest | 关闭深度测试 |
DisableCulling | 禁用面剔除(双面渲染) |
InvertCulling | 反转剔除方向(渲染背面) |
Wireframe | 线框模式渲染 |
StencilWrite | 启用模板缓冲写入 |
EnableStencilTest | 启用模板测试 |
混合因子可选值¶
blendSrc与blendDst字段控制Alpha混合的源因子与目标因子。常见可选值如下:
| 值 | 说明 |
|---|---|
Zero | 因子为0 |
One | 因子为1 |
SourceColor | 使用源片段的颜色值 |
OneMinusSourceColor | 使用1 - 源颜色 |
DestColor | 使用目标缓冲区的颜色值 |
OneMinusDestColor | 使用1 - 目标颜色 |
SourceAlpha | 使用源片段的Alpha值 |
OneMinusSourceAlpha | 使用1 - 源Alpha |
DestAlpha | 使用目标缓冲区的Alpha值 |
OneMinusDestAlpha | 使用1 - 目标Alpha |
SourceAlphaSaturate | 取源Alpha与1 - 目标Alpha中的较小值 |
启用混合时,游戏默认使用blendSrc: SourceAlpha、blendDst: OneMinusSourceAlpha的标准Alpha混合模式。
+samplerStates详情¶
+samplerStates字段为数组,每项描述一个采样器。常用字段如下:
| 字段 | 说明 |
|---|---|
samplerIndex | 采样器索引,通常为0(漫反射纹理)或1(自发光/叠加纹理) |
textureFilter | 纹理过滤模式 |
textureWrap | 纹理寻址模式 |
textureFilter可选值:
| 值 | 说明 |
|---|---|
Point | 邻近点采样,无过滤(像素风格) |
Bilinear | 双线性过滤 |
Trilinear | 三线性过滤(含Mipmap混合) |
MipMapBilinear | Mipmap双线性过滤 |
MipMapLinear | Mipmap线性过滤 |
TexelAA | 纹素抗锯齿过滤 |
PCF | 百分比邻近过滤(主要用于阴影贴图) |
textureWrap可选值:
| 值 | 说明 |
|---|---|
Repeat | 平铺重复(默认) |
Clamp | 边缘拉伸(夹紧) |
Mirror | 镜像重复 |
Border | 超出范围使用边框颜色(不常用) |
MirrorOnce | 仅镜像一次后夹紧 |
msaaSupport可选值¶
msaaSupport字段控制材质在多重采样抗锯齿(MSAA)环境下的行为:
| 值 | 说明 |
|---|---|
NonMSAA | 仅在非MSAA渲染路径中使用此材质变体 |
MSAA | 仅在MSAA渲染路径中使用此材质变体 |
Both | 在所有路径中通用(默认) |
primitiveMode可选值¶
primitiveMode字段指定几何体的图元装配方式:
| 值 | 说明 |
|---|---|
TriangleList | 三角形列表(默认,每三个顶点组成一个独立三角形) |
TriangleStrip | 三角形条带 |
LineList | 线段列表 |
Line | 线段条带 |
QuadList | 四边形列表(每四个顶点组成一个四边形) |
原版材质列表¶
以下列出基岩版中供附加包引用的原版材质标识符及其已知属性。可在客户端实体定义中直接引用这些标识符名称。由于材质系统在RenderDragon时代经历了较大变化,部分材质在新渲染路径下的具体表现可能与早期测试结果存在差异,建议实际使用时在目标设备上验证效果。
行为不稳定
材质系统不适合轻率使用。部分材质可能导致崩溃、内容日志报错或加载缓慢。强烈建议自行实验并以实际设备测试结果为准。
| 材质标识符 | 主要属性 |
|---|---|
alpha_block | 背面剔除、完全不透明 |
alpha_block_color | 背面剔除、Alpha通道(半透明) |
banner | 无特殊属性(透明物体后方渲染不稳定) |
banner_pole | 背面剔除、透明效果(透明物体后方渲染不稳定) |
beacon_beam | 完全不透明 |
beacon_beam_transparent | Alpha通道(后方粒子呈"正面剔除"效果) |
charged_creeper | 自发光、固定透明度(透明物体后方渲染不稳定) |
conduit_wind | 透明效果、Alpha通道(半透明) |
entity | 完全不透明、背面剔除 |
entity_alphablend | 背面剔除、Alpha通道(透明物体后方渲染不稳定) |
entity_alphablend_nocolorentity_static | 未知属性,可能导致崩溃 |
entity_alphatest | 透明效果、Alpha通道(半透明) |
entity_alphatest_change_color | 透明效果、Alpha通道(不透明) |
entity_alphatest_change_color_glint | 未知属性 |
entity_alphatest_glint | 未知属性 |
entity_alphatest_glint_item | 未知属性 |
entity_alphatest_multicolor_tint | 灰度处理、背面剔除、透明效果(不透明) |
entity_beam | 透明效果、Alpha通道(半透明) |
entity_beam_additive | 透明效果、自发光、背面剔除、固定透明度(始终渲染在最上层) |
entity_change_color | 完全不透明 |
entity_change_color_glint | 未知属性 |
entity_custom | 背面剔除、Alpha通道(透明物体后方渲染不稳定) |
entity_dissolve_layer0 | 未知属性(透明物体后方渲染不稳定) |
entity_dissolve_layer1 | 未知属性 |
entity_emissive | 自发光、完全不透明、背面剔除 |
entity_emissive_alpha | 自发光、Alpha通道、透明效果 |
entity_emissive_alpha_one_sided | 自发光、Alpha通道、透明效果、背面剔除 |
entity_flat_color_line | 背面剔除、完全不透明 |
entity_glint | 未知属性 |
entity_lead_base | Alpha通道(透明物体后方渲染不稳定) |
entity_loyalty_rope | 未知属性 |
entity_multitexture | 未知属性 |
entity_multitexture_alpha_test | 未知属性 |
entity_multitexture_alpha_test_color_mask | 未知属性 |
entity_multitexture_color_mask | 未知属性 |
entity_multitexture_masked | 未知属性 |
entity_multitexture_multiplicative_blend | 未知属性 |
entity_nocull | 完全不透明(无背面剔除) |
guardian_ghost | 未知属性 |
item_in_hand | 完全不透明、背面剔除 |
item_in_hand_entity_alphatest | 透明效果、Alpha通道(半透明) |
item_in_hand_entity_alphatest_color | 未知属性 |
item_in_hand_glint | 未知属性 |
item_in_hand_multicolor_tint | 灰度处理、背面剔除、透明效果 |
map | 未知属性 |
map_decoration | 未知属性 |
map_marker | 未知属性 |
moving_block | 完全不透明 |
moving_block_alpha | Alpha通道(半透明) |
moving_block_alpha_seasons | Alpha通道(半透明) |
moving_block_alpha_single_side | 背面剔除、Alpha通道(半透明) |
moving_block_blend | 混合透明 |
moving_block_double_side | 完全不透明(无背面剔除) |
moving_block_seasons | 完全不透明 |
opaque_block | 完全不透明、背面剔除 |
opaque_block_color | 完全不透明、背面剔除(带颜色叠加) |
opaque_block_color_uv2 | 完全不透明、背面剔除(带颜色叠加及UV2) |