Bedrock Wiki
  • QQ
  • 原站
新手入门指南
  • Guide
    • 1. 简介
      指南
    • 2. 附加组件详解
    • 3. 软件与准备工作
    • 4. 项目设置
    • 5. 创建自定义物品
    • 6. 创建自定义实体
    • 7. Blockbench:建模、贴图与动画制作
    • 8. 添加战利品表、生成规则与合成配方
  • Extra
    • a. 理解JSON
    • b. 下载示例包
    • c. 故障排除
      帮助
    • d. 高级清单文件指南
    • e. 格式版本
    • f. Android 项目设置
JSON UI
  • General
    • JSON UI 入门指南
      指南
    • 最佳实践
      指南
  • Tutorials
    • Aseprite 动画
    • 保留标题文本
      中级
    • 修改服务器表单
      中级
    • 字符串与数字转换
      中级
    • 按钮与开关
      新手
    • 添加HUD界面元素
      新手
  • Documentation
    • JSON UI 文档
Meta
  • Style Guide
  • 使用JSON模式(Schemas)
  • 实用链接
  • 版本控制
  • 附加包性能优化
  • Q&A
    • GameTest 问答集 2021/08/06
    • 世界生成问答 2024/11/15
    • 延迟渲染技术预览问答 2024/02/23
    • 方块与物品问答 2024/08/30
    • 脚本与编辑器问答 2023/09/22
NBT
  • General
    • .mcstructure
  • Tutorials
    • 扩展结构限制
      简单
    • 教育版中的实验功能
      简单
  • NBT in Depth
    • NBT 库列表
      专家
    • NBT读取示例
      专家
    • 关于NBT(命名二进制标签)
      专家
世界生成
  • General
    • 世界生成入门
      指南
      实验性
    • 特性类型
      实验性
    • 生物群系
      指南
      实验性
  • Tutorials
    • 特征(Feature)的方块条件
      实验性
    • 生成地表区块
      实验性
    • 生成自定义矿石
      实验性
    • 生成自定义结构
      实验性
    • 高度图噪声地形
      实验性
  • Documentation
    • 生物群系标签
动画控制器
  • 动画控制器入门指南
    指南
  • 实体命令
    中级
  • AFK检测器
  • 将Molang变量转换为计分板数值
  • 死亡指令
  • 重生指令
命令
  • General
    • 命令方块入门指南
    • 函数
    • NBT 命令
    • 坐标系
    • 方块状态
    • 理解目标选择器
    • 记分板操作
  • Commands
    • Execute
      简单
    • Playanimation
    • 伤害
    • 播放音效
  • On Event Systems
    • 玩家首次加入时
    • On Player Join
    • 玩家离开时触发
    • 玩家死亡事件
    • 玩家重生事件系统
    • 首次加载世界时
  • Scoreboard Systems
    • 实体计数器
    • 计分板计时器
    • 比较与获取分数
  • Techniques
    • 执行逻辑门
    • MBE - Max的方块实体
    • FMBE - 创建显示实体的新方法
    • 视线检测
    • 移动状态检测
    • 轨道摄像机
  • Useful Creations
    • 多人位置重排系统
      函数
    • 自定义合成台
      简单
实体
  • General
    • Intro to Entities BP
      指南
      新手
    • 实体资源包入门
      指南
      新手
    • 实体问题排查指南
      帮助
    • NPC对话系统
      中级
    • 实体事件
      新手
    • 实体属性
    • 渲染控制器
      新手
    • 生成规则
  • Tutorials
    • 任意坐标系间的坐标转换(世界、实体、骨骼)
      中级
    • 创建船只
      中级
    • 实体手持物品
      中级
    • 实体攻击机制
      中级
    • 实体睡眠机制
      中级
    • 实体碰撞体
      中级
    • 实体移动
    • 实体计时器
      中级
    • 无敌实体
      新手
    • 村庄机制实现指南
    • 检测其他实体
      中级
    • 生成已驯服的实体
      脚本
      中级
    • 视线检测实体
      中级
    • 禁用队友伤害
      中级
    • 范围效果云入门指南
      中级
    • 虚拟实体
      新手
    • 飞行实体控制
      中级
  • Documentation
    • Vanilla Usage Spawn Rules
    • 原版使用组件
    • 抛射物
    • 虚拟组件
    • 运行时标识符
    • 非生物实体运行时标识符
战利品、配方与交易
  • General
    • 交易行为
  • Documentation
    • 战利品表
    • 交易表
    • 合成配方
    • 物品函数
  • Tutorials
    • 随机化结构战利品
      简单
文档
  • Shared Constructs
  • Molang 查询详解
  • Vanilla Materials
    专家
  • 声音定义
  • 文件类型
  • 材质配置文件说明
    专家
  • 菜单分类
  • 资源包文件夹结构
  • 雾效ID
  • 高级Molang指南
方块
  • General
    • 方块入门指南
      指南
      新手
    • 方块组件
    • Block Tags
    • 方块状态
    • Block Traits
    • 方块排列组合
    • 方块事件
      脚本
    • 方块事件迁移指南
      帮助
    • 方块物品化
      中级
    • 方块问题排查指南
      帮助
  • Visuals
    • 方块剔除
      中级
    • 方块模型
      指南
      新手
      简单
    • 方块着色
      简单
    • 方块纹理动画
      中级
    • 方块纹理变体
      中级
  • Tutorials
    • Precise Interaction
      专家
      脚本
    • Precise Rotation
      专家
      脚本
    • 伪方块
      中级
    • 可旋转方块
    • 应用持续效果
      简单
      脚本
    • 矿石战利品表
      简单
      脚本
    • 规避状态值限制
      专家
  • Vanilla Re-Creations
    • 自定义作物
      中级
      脚本
    • 自定义活板门
      中级
      脚本
    • 自定义玻璃
      新手
      简单
      已弃用
    • 自定义釉面陶瓦
      简单
  • Documentation
    • 原版方块模型
      新手
    • 方块形状
    • 方块格式历史
    • 方块音效
服务器
  • Software
    • Bedrock Server Software
  • Protocols
    • Bedrock Protocol
    • NetherNet 协议
    • RakNet 协议
概念
  • contents.json
  • Molang
    中级
  • Rawtext
  • textures_list.json
  • 命名空间
  • 子包
  • 文本与本地化
  • 着色器
  • 纹理图集
    中级
  • 表情符号与特殊字符
  • 覆盖资源
    中级
  • 音效
    中级
物品
  • General
    • 物品入门指南
      指南
      新手
    • 物品组件
    • 物品标签
    • 物品事件
      脚本
    • Item Event Migration
      帮助
    • 物品问题排查指南
      帮助
  • Tutorials
    • Custom Pottery Sherds
    • 可投掷物品
      中级
    • 生成物品
      中级
    • 自定义武器
      简单
    • 自定义盔甲
    • 自定义食物
      简单
      脚本
    • 通过装备物品执行命令
      实验性
      中级
    • 高分辨率物品
  • Documentation
    • 附魔
    • Numerical Item IDs
    • Vanilla Usage Components
    • 原版物品标识符
      已弃用
    • 可附着物
      新手
    • 物品格式历史记录
视觉效果
  • General
    • 实体视觉效果简介
      指南
    • 基岩版建模指南
    • 动画中的特效
    • 基于数学的动画
      中级
    • 材质
      专家
    • 材质创作
      专家
    • 皮肤包制作指南
    • 自定义死亡动画
      中级
  • Tutorials
    • Glowing Entity Texture
    • 受伤动画
      中级
    • 实体纹理动画
      中级
    • 栓绳位置调整
      简单
    • 玩家几何模型
      新手
    • 移除实体阴影
      中级
    • 重绘生成蛋纹理
      新手
  • Ideas
    • 结构展示技巧
粒子效果
  • General
    • 粒子效果入门
      指南
  • Tutorials
    • 禁用粒子效果
      新手
  • Documentation
    • 原版粒子效果
脚本编写
  • General
    • 脚本编程入门
    • 什么是Script API?
    • API 模块
  • Tutorials
    • GameTests
      实验性
    • 简易聊天命令
      实验性
    • 脚本核心功能
    • 脚本表单
      实验性
    • 脚本请求API
      实验性
    • 阻止方块放置
  • Documentation
    • JavaScript 问题排查指南
    • Script Resources
    • Script Watchdog
      实验性
    • TypeScript
    • 引擎环境
虚拟现实
  • General
    • 启用VR模式
      指南
    • 配置资源包
      专家
  • Tutorials
    • 编辑你的第一个模型
      专家

材质配置文件说明

expert
材质配置文件说明
  • 前言
  • 材质文件体系
  • 材质语法说明
  • 材质所有属性字段概览
    • 渲染状态
    • 着色器路径
    • 着色器宏定义
    • 运行时状态

WARNING

材质配置不适合心理承受能力弱者。请做好可能遇到游戏崩溃、内容日志报错以及长时间加载的准备。

前言 ​

本文译自网易中国版开发者手册(https://mc.163.com/dev/mcmanual/mc-dev/mcguide/),将详细解析材质文件的结构与配置方式。

材质文件体系 ​

我们将以微软原生材质文件为例进行说明。首先,目录下的文件主要是以".material"为后缀的文件。此外还有三个重要的json文件:common.json、fancy.json和sad.json。

先来看sad.json和fancy.json,它们用于控制画面质量表现。各自定义了一个材质文件列表。fancy.json通常会比sad.json多定义几个材质文件,且可能在某些材质文件中额外添加了一些宏定义,着色器可以通过判断这些宏来做特殊处理:

sad.json
json
[
	{"path":"materials/sad.material"},
	{"path":"materials/entity.material"},
	{"path":"materials/terrain.material"},
	{"path":"materials/portal.material"},
	{"path":"materials/barrier.material"},
	{"path":"materials/wireframe.material"}
]
1
2
3
4
5
6
7
8
fancy.json
json
[
	{"path":"materials/fancy.material", "+defines":["FANCY"]},
	{"path":"materials/entity.material", "+defines":["FANCY"]},
	{"path":"materials/terrain.material", "+defines":["FANCY"]},
	{"path":"materials/hologram.material"},
	{"path":"materials/portal.material", "+defines":["FANCY"]},
	{"path":"materials/barrier.material"},
	{"path":"materials/wireframe.material"}
]
1
2
3
4
5
6
7
8
9

可以看出fancy.json比sad.json多定义了fancy.material和hologram.material材质文件,同时还为多个材质文件定义了FANCY宏。游戏设置/视频/精美图像这个开关就是控制sad和fancy之间的切换。当开启精美图像开关时,fancy.json中的材质文件会生效,关闭时则sad.json中的材质文件生效。

为了达到更好的表现效果,fancy.json中的材质文件通常会有更复杂的运算,而sad.json中的材质通常会牺牲一点表现效果换取更好的性能。如果开发者需要编写更复杂的着色器,建议同时编写一个低配版本,然后分别在fancy和sad中定义。让玩家通过游戏中的精美图像选项来控制是否开启对应效果。

common.json
json
[
	{"path":"materials/particles.material"},
	{"path":"materials/shadows.material"},
	{"path":"materials/sky.material"},
	{"path":"materials/ui.material"},
	{"path":"materials/ui3D.material"},
	{"path":"materials/portal.material"},
	{"path":"materials/barrier.material"},
	{"path":"materials/wireframe.material"}
]
1
2
3
4
5
6
7
8
9
10

相比sad和fancy可以互相切换,common.json中定义的材质文件会在进入游戏后始终加载。除了common.json、sad.json、fancy.json中声明的材质文件外,其他材质文件不会被加载。

材质语法说明 ​

我们以其中一个材质文件entity.material为例进行说明。打开文件可以看到文件以materials开头,然后定义了版本号version为1.0.0,这些都是固定格式,标识这个材质文件的解析方式,我们可以暂时忽略不做修改。

可以看到材质中每个字段的定义都是以键值对的形式,例如:

json
[
	"vertexShader": "shaders/entity.vertex",
]
1
2
3

冒号左边代表键vertexShader,右边代表值shaders/entity.vertex;

也有列表形式的定义:

json
[
	"vertexFields": [
        { "field": "Position" },
        { "field": "Normal" },
        { "field": "UV0" }
    ],
]
1
2
3
4
5
6
7

带有符号[ ]的就是一个列表,然后里面是每个子元素的json定义。

材质所有属性字段概览 ​

渲染状态 ​

states ​

配置渲染环境,可以有以下取值:

  • EnableAlphaToCoverage:一种针对半透明物体的顺序无关渲染方式。此开关仅在支持MSAA的环境中有用。开启后物体边缘会根据透明度更精确地柔化过渡。也可用于一些网格大量重叠的复杂场景。

  • Wireframe:线框绘制模式

  • Blending:开启颜色混合模式,常用于渲染半透明物体。声明此项后通常需要声明混合因子blendSrc、blendDst

  • DisableColorWrite:不向颜色缓冲写入颜色值,RGBA通道都不写入

  • DisableAlphaWrite:不向颜色缓冲写入透明度alpha值,允许写入RGB值

  • DisableRGBWrite:不向颜色缓冲写入透明度RGB值,允许写入alpha值

  • DisableDepthTest:关闭深度测试

  • DisableDepthWrite:关闭深度写入

  • DisableCulling:同时渲染正反面

  • InvertCulling:使用正面裁剪。默认为背面裁剪。声明此项后渲染背面,正面被裁剪。

  • StencilWrite:开启模板掩码写入

  • EnableStencilTest:开启模板掩码测试

着色器路径 ​

vertexShader ​

顶点着色器路径,通常为shaders/XXX.vertex。

vrGeometryShader或geometryShader ​

几何着色器路径,通常为shaders/XXX.geometry,移动端不使用,无需修改。

fragmentShader ​

片段着色器路径,通常为shaders/XXX.fragment。

着色器宏定义 ​

defines ​

定义所用着色器的宏。为了实现代码复用,我们很多不同的材质使用的是同一个着色器。此时如果想在着色器某处根据当前材质执行不同逻辑,可以通过材质defines声明的宏来判断。我们可以用材质entity_for_skeleton举例说明。这里可以看到定义了USE_SKINNING、USE_OVERLAY、NETEASE_SKINNING三个宏。

json
"entity_for_skeleton": {
	"vertexShader": "shaders/entity.vertex",
	"vrGeometryShader": "shaders/entity.geometry",
	"fragmentShader": "shaders/entity.fragment",
	"+defines": [ "USE_SKINNING", "USE_OVERLAY", "NETEASE_SKINNING" ],
	"vertexFields": [
		{ "field": "Position" },
		{ "field": "Normal" },
		{ "field": "BoneId0" },
		{ "field": "UV0" }
	],
	"msaaSupport": "Both",
	"+samplerStates": [
		{
			"samplerIndex": 0,
			"textureFilter": "Point"
		}
	]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

查看顶点着色器entity.vertex,会有#ifdef、#else、#endif来判断宏并执行不同逻辑分支。这些宏的判断语句是在编译时处理的,不同于传统着色器中的if else,编译时处理的逻辑分支在实际运行时不会产生分支,性能不会因为分支而下降。另外可以看到下面宏还可以做多层判断,先判断NETEASE_SKINNING宏,然后在内部执行逻辑中再判断LARGE_VERTEX_SHADER_UNIFORMS宏:

glsl
#ifdef NETEASE_SKINNING
		MAT4 boneMat = transpose(mat3x4ToMat4(BONES_70[int(BONEID_0)]));
		entitySpacePosition = boneMat * POSITION;
		entitySpaceNormal = boneMat * NORMAL;
#else
	#if defined(LARGE_VERTEX_SHADER_UNIFORMS)
		entitySpacePosition = BONES[int(BONEID_0)] * POSITION;
		entitySpaceNormal = BONES[int(BONEID_0)] * NORMAL;
	#else
		entitySpacePosition = BONE * POSITION;
		entitySpaceNormal = BONE * NORMAL;
	#endif
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13

运行时状态 ​

深度测试 ​

depthFunc ​

深度检测通过函数,可以使用以下取值:

  • Always:总是通过

  • Equal:当深度值等于缓冲值时通过

  • NotEqual:当深度值不等于缓冲值时通过

  • Less:当深度值小于缓冲值时通过

  • Greater:当深度值大于缓冲值时通过

  • GreaterEqual:当深度值大于等于缓冲值时通过

  • LessEqual:当深度值小于等于缓冲值时通过

关联states渲染环境配置:

  • DisableDepthTest:关闭深度测试

  • DisableDepthWrite:关闭深度写入

模板掩码测试 ​

stencilRef ​

用于与掩码缓冲比较或写入的值

stencilRefOverride ​

是否使用缓冲当前值作为stencilRef,支持0或1:

  • 1:使用配置的stencilRef。如果配置了stencilRef,stencilRefOverride会自动取1

  • 0:使用缓冲当前值作为stencilRef,此时不要配置stencilRef

stencilReadMask ​

掩码缓冲值与stencilRef值在比较前会先与stencilReadMask做位与

stencilWriteMask ​

stencilRef值在写入掩码缓冲前会先与stencilWriteMask做位与

frontFace和backFace ​

配置在网格正面或背面使用哪种掩码测试函数。另外判断顺序是先掩码检测,再深度检测。需要配置以下操作:

  • stencilFunc:stencilRef与掩码缓冲比较时使用的方法,支持以下取值:

    • Always:总是通过
    • Equal:当stencilRef等于缓冲值时通过
    • NotEqual:当stencilRef不等于缓冲值时通过
    • Less:当stencilRef小于缓冲值时通过
    • Greater:当stencilRef大于缓冲值时通过
    • GreaterEqual:当stencilRef大于等于缓冲值时通过
    • LessEqual:当stencilRef小于等于缓冲值时通过
  • stencilFailOp:stencilFunc比较函数返回失败时执行的处理,支持以下取值:

    • Keep:保持缓冲原值
    • Replace:将stencilRef位与stencilWriteMask的值写入缓冲
  • stencilDepthFailOp:stencilFunc比较函数返回成功,但深度测试失败时执行的处理,支持以下取值:

    • Keep:保持缓冲原值
    • Replace:将stencilRef位与stencilWriteMask的值写入缓冲
  • stencilPassOp:stencilFunc比较函数返回成功,且深度测试成功时执行的处理,支持以下取值:

    • Keep:保持缓冲原值
    • Replace:将stencilRef位与stencilWriteMask的值写入缓冲

关联states渲染环境配置:

  • StencilWrite:开启掩码写入

  • EnableStencilTest:开启掩码测试

最后我们来看一个例子:

json
    "shadow_back": {
      "+states": [
        "StencilWrite",
        "DisableColorWrite",
        "DisableDepthWrite",
        "InvertCulling",
        "EnableStencilTest"
      ],

      "vertexShader": "shaders/position.vertex",
      "vrGeometryShader": "shaders/position.geometry",
      "fragmentShader": "shaders/flat_white.fragment",

      "frontFace": {
        "stencilFunc": "Always",
        "stencilFailOp": "Keep",
        "stencilDepthFailOp": "Keep",
        "stencilPassOp": "Replace"
      },

      "backFace": {
        "stencilFunc": "Always",
        "stencilFailOp": "Keep",
        "stencilDepthFailOp": "Keep",
        "stencilPassOp": "Replace"
      },

      "stencilRef": 1,
      "stencilReadMask": 255,
      "stencilWriteMask": 1,

      "vertexFields": [
        { "field": "Position" }
      ],
      "msaaSupport": "Both"
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

例子中StencilWrite代表支持向掩码缓冲写入,EnableStencilTest代表开启掩码测试,frontFace的配置代表渲染正面时掩码测试总是通过,如果深度测试失败则保持缓冲值不变,如果也都通过则将stencil位与stencilWriteMask的值写入缓冲,即1 & 1 = 1的值。backFace的配置也类似。

混合半透明物体颜色混合 ​

半透明物体的渲染需要配置混合因子。最终输出的rgb颜色值 = 当前颜色值 * 源混合因子 + 缓冲中的颜色值 * 目标混合因子

blendSrc ​

源混合因子

blendDst ​

目标混合因子

alphaSrc ​

计算alpha时的源混合因子,通常不配置取默认值

alphaDst ​

计算alpha时的目标混合因子,通常不配置取默认值

总共混合因子可以取以下值:

  • DestColor:缓冲颜色值

  • SourceColor:当前颜色值

  • Zero:(0,0,0)

  • One:(1,1,1)

  • OneMinusDestColor:(1,1,1) - 缓冲颜色值

  • OneMinusSrcColor:(1,1,1) - 当前颜色值

  • SourceAlpha:当前颜色值中的alpha值

  • DestAlpha:缓冲颜色值中的alpha值

  • OneMinusSrcAlpha:1 - 当前颜色值中的alpha值

在引擎中,默认是:

  • blendSrc:SourceAlpha

  • blendDst:OneMinusSrcAlpha

  • alphaSrc:One

  • alphaDst:OneMinusSrcAlpha

关联states渲染环境配置:

  • Blending:开启颜色混合模式,常用于渲染半透明物体。声明此项后通常需要声明混合因子blendSrc、blendDst

  • DisableColorWrite:不向颜色缓冲写入颜色值,RGBA通道都不写入

  • DisableAlphaWrite:不向颜色缓冲写入透明度alpha值,允许写入RGB值

  • DisableRGBWrite:不向颜色缓冲写入透明度RGB值,允许写入alpha值

采样纹理sample ​

samplerStates ​

配置采样状态,值为列表,根据要采样的纹理数量配置每个纹理。通常如果在顶点属性中声明了UV0和UV1,代表需要采样两个纹理,这里就需要配置两个元素。我们来看子元素的定义:

json
{
	"samplerIndex": 0,
	"textureFilter": "Point",
	"textureWrap": "Repeat"
}
1
2
3
4
5

每个属性定义如下:

samplerIndex ​

数字,代表当前正在设置的纹理的属性,从0开始

textureFilter ​

纹理过滤模式(默认为Point),当实际显示的纹理贴图相比原图有放大或缩小时,新分辨率贴图与原分辨率贴图像素之间的映射关系可以有如下取值:

  • Point:点采样

  • Bilinear:双线性采样

  • Trilinear:三线性采样

  • MipMapBilinear:MipMap双线性采样

  • TexelAA:Texel抗锯齿(非所有设备支持,不建议使用)

  • PCF:通过比较函数采样(非所有设备支持,不建议使用)

textureWrap ​

纹理包裹模式,控制当uv在[0,1]之外时应该采样什么样的纹理。可以有如下取值:

  • Repeat:重复,即对值取模到[0,1]进行采样

  • Clamp:边缘采样,采样最近边缘的值,即如果1.1离1更近则取1;-0.1离0更近则取0。

顶点 ​

vertexFields ​

顶点属性,用于声明使用这个材质渲染的网格的每个顶点持有哪些属性。由美术在生产资源时决定。可能会用到以下取值:

  • Position:模型空间坐标

  • Color:颜色

  • Normal:法线

  • UV0:纹理采样坐标

  • UV1:纹理采样坐标

  • UV2:纹理采样坐标

  • BoneId0:骨骼ID,用于骨骼模型

光栅化环境配置 ​

msaaSupport ​

配置MSAA(多重采样抗锯齿)支持(引擎中默认为NonMSAA)

  • NonMSAA:不开启MSAA时允许材质

  • MSAA:开启MSAA时允许材质

  • Both:无论是否开启MSAA都允许材质。通常直接用这个值即可。

深度偏移 ​

深度偏移主要用于解决z-fighting问题,即当两个物体深度相近时,渲染时有些帧会显示这个物体,有些帧会显示另一个物体。深度偏移的原理是将其中一个物体向大或小的深度方向偏移,使它们的深度不再相同。可以配置以下四个变量:

  • depthBias

  • slopeScaledDepthBias

  • depthBiasOGL

  • slopeScaledDepthBiasOGL

具体偏移深度为:

offset = (slopeScaledDepthBias * m) + (depthBias * r)

在OGL平台为:

offset = (slopeScaledDepthBiasOGL * m) + (depthBiasOGL * r)

m为多边形深度斜率的最大值(在光栅化阶段计算)。多边形与近裁剪平面越平行,m越接近0。r是在窗口坐标系中能产生可分辨的深度值差异的最小值,r是实现OpenGL的平台指定的一个常数。

关联states渲染环境配置:

  • Wireframe:线框绘制模式

  • DisableCulling:同时渲染正反面

  • InvertCulling:使用正面裁剪。默认为背面裁剪。声明此项后渲染背面,正面被裁剪。

图元 ​

primitiveMode ​

图元渲染模式(引擎中默认为TriangleList):

  • None:不渲染,正常不会使用

  • QuadList:四边形模式

  • TriangleList:每三个顶点绘制一个三角形的模式,例如第一个三角形使用顶点v0、v1、v2,第二个使用v3、v4、v5

  • TriangleStrip:每个顶点会与前两个顶点形成一个三角形,结构稍复杂,

贡献者

编辑 材质配置文件说明

Bedrock Wiki by Bedrock OSS ,Translate by 8aka-Team

"Minecraft"是Mojang AB的注册商标。

Bedrock OSS、Bedrock Wiki以及 bedrock.dev 与Microsoft及Mojang AB不存在任何隶属关系。

  • 隐私政策
  • 加入QQ社区
  • 参与贡献指南
  • 访问代码仓库