Skip to content

Commit 056316b

Browse files
3.4 材质系统 (cocos#1986)
材质系统
1 parent f2368f9 commit 056316b

File tree

125 files changed

+2520
-746
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+2520
-746
lines changed

zh/SUMMARY.md

+38-22
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
# Summary
22

3-
## 新手入门
3+
[Cocos Creator 3.4 用户手册](index.md)
44

5-
[介绍](index.md)
5+
## 基础使用
66

7-
- [基础使用](getting-started/index.md)
7+
- [新手上路](getting-started/index.md)
88
- [关于 Cocos Creator](getting-started/introduction/index.md)
99
- [安装和启动](getting-started/install/index.md)
1010
- [使用 Dashboard](getting-started/dashboard/index.md)
1111
- [Hello World!](getting-started/helloworld/index.md)
1212
- [项目结构](getting-started/project-structure/index.md)
13-
- [编辑器界面](editor/index.md)
14-
- [场景编辑器](editor/scene/index.md)
15-
- [层级管理器](editor/hierarchy/index.md)
16-
- [资源管理器](editor/assets/index.md)
17-
- [属性检查器](editor/inspector/index.md)
18-
- [控制台](editor/console/index.md)
19-
- [偏好设置](editor/preferences/index.md)
20-
- [项目设置](editor/project/index.md)
21-
- [主菜单](editor/mainMenu/index.md)
22-
- [工具栏](editor/toolbar/index.md)
23-
- [编辑器布局](editor/editor-layout/index.md)
24-
- [预览调试](editor/preview/index.md)
25-
- [获取帮助和支持](getting-started/support.md)
26-
- [注意事项](getting-started/attention/index.md)
13+
- [编辑器界面](editor/index.md)
14+
- [场景编辑器](editor/scene/index.md)
15+
- [层级管理器](editor/hierarchy/index.md)
16+
- [资源管理器](editor/assets/index.md)
17+
- [属性检查器](editor/inspector/index.md)
18+
- [控制台](editor/console/index.md)
19+
- [偏好设置](editor/preferences/index.md)
20+
- [项目设置](editor/project/index.md)
21+
- [主菜单](editor/mainMenu/index.md)
22+
- [工具栏](editor/toolbar/index.md)
23+
- [编辑器布局](editor/editor-layout/index.md)
24+
- [预览调试](editor/preview/index.md)
25+
- [获取帮助和支持](getting-started/support.md)
26+
- [注意事项](getting-started/attention/index.md)
2727
- [快速上手:制作第一个游戏](getting-started/first-game/index.md)
2828
- [升级指南](release-notes/index.md)
2929
- [v3.0 升级指南](release-notes/upgrade-guide-v3.0.md)
@@ -33,7 +33,7 @@
3333
- [资源分包升级指南](asset/subpackage-upgrade-guide.md)
3434
- [资源管理模块升级指南](asset/asset-manager-upgrade-guide.md)
3535

36-
## 基本工作流
36+
## 工作流
3737

3838
- [场景制作](concepts/scene/index.md)
3939
- [场景资源](asset/scene.md)
@@ -147,10 +147,26 @@
147147
- [压缩纹理](asset/compress-texture.md)
148148
- [渲染纹理](asset/render-texture.md)
149149
- [材质系统](material-system/overview.md)
150-
- [YAML 101](material-system/yaml-101.md)
151-
- [Effect Syntax](material-system/effect-syntax.md)
152-
- [Pass Params](material-system/pass-parameter-list.md)
153-
- [Builtin Shader Uniforms](material-system/builtin-shader-uniforms.md)
150+
- [在脚本中使用材质](material-system/material-script.md)
151+
- [内置材质](material-system/builtin-material.md)
152+
- [材质系统类图](material-system/material-structure.md)
153+
- [着色器](shader/index.md)
154+
- [着色器资源](shader/effect-inspector.md)
155+
- [着色器语法](shader/effect-syntax.md)
156+
- [Pass 可选配置参数](shader/pass-parameter-list.md)
157+
- [YAML 101 语法简介](shader/yaml-101.md)
158+
- [GLSL 语法简介](shader/glsl.md)
159+
- [预处理宏定义](shader/macros.md)
160+
- [着色器片段(Chunk)](shader/effect-chunk-index.md)
161+
- [Cocos Effect 内置 Uniform](shader/uniform.md)
162+
- [内置着色器](shader/effect-builtin.md)
163+
- [基于物理的光照模型 PBR](shader/effect-builtin-pbr.md)
164+
- [卡通渲染](shader/effect-builtin-toon.md)
165+
- [无光照](shader/effect-builtin-unlit.md)
166+
- [自定义着色器](shader/write-effect-overview.md)
167+
- [3D 着色器:RimLight](shader/write-effect-3d-rim-light.md)
168+
- [2D 着色器:Gradient](shader/write-effect-2d-sprite-gradient.md)
169+
154170
- [特效组件](module-map/effects/index.md)
155171
- [广告牌](particle-system/billboard-component.md)
156172
- [线段组件](particle-system/line-component.md)

zh/asset/material.md

+60-14
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,77 @@
1-
## 材质资源
1+
# 材质资源
22

3-
### 材质创建
3+
## 材质创建
44

5-
材质创建方式如下
5+
**资源管理器** 面板中点击右键并选择 **创建 -> 材质**
66

77
![material-create](material/material-create.png)
88

9-
9+
或者点击 **资源管理器** 左上角的 **+** 号按钮并选择 **材质**
1010

1111
![material-create-menu](material/material-create-menu.png)
1212

13-
材质控制着每个模型最终的着色,材质由 Effect 构成,由材质操控 Effect 的着色流程。材质本身也可以看作是 Effect 资源的容器,材质可以任意切换当前要使用的 Effect 资源。下图就是我们创建的材质默认选择的 Effect 资源。
13+
此时便会在 **资源管理器** 中创建一个默认名为 **material** 的材质资源:
1414

15-
![default-effect](material/default-effect.png)
15+
![default-material](material/default-material.png)
1616

17-
同时,我们还可以通过点击 Effect 属性右边的框要切换当前材质的 Effect
17+
材质控制着每个模型最终的着色,材质由着色器构成,通过材质和着色器控制最终的着色流程
1818

19-
![effects](material/effects.png)
19+
## 材质资源属性
2020

21-
### Effect 创建
21+
| 属性 | 说明 |
22+
| :-- | :-- |
23+
| Effect(着色器) | 当前材质所使用的着色器,默认使用的是内置 PBR 着色器 [builtin-standard.effect](../shader/effect-builtin-pbr.md)。<br>点击 Effect 的下拉框,可以看到当前项目中所有的着色器,开发者可根据需要选择使用。当切换了着色器后其他属性也会同步更新,详情请参考 [着色器](../shader/effect-inspector.md)。<br>点击右侧的 ![image](../material-system/img/locate.png) 按钮,会在 **资源管理器** 中定位当前使用的着色器。|
24+
| Technique | Technique 下拉框会列出当前使用的着色器中所有的 Technique。一个着色器中可能会存在多个 Technique,每个 Technique 适用于不同的情况,例如效果差一点但是性能更好的 Technique 更适合用于手机平台。当切换了 Technique 后 Pass 列表也会同步更新。 |
25+
| USE INSTANCING | 是否启用动态 Instancing。需要注意的是,Instancing 只应该在场景中有大量相同模型的实例时启用,适当合理地应用 Instancing 可以有不错的性能提升,但过度使用反而很可能会因为额外的开销维护导致性能下降 |
26+
| USE BATCHING | 是否启用动态 VB 合并式合批。 |
27+
| Pass | Pass 列表会列出当前使用的 Technique 中所有的 Pass(例如 Pass 0、Pass 1、Pass 2......)。<br>每个 Pass 可能会有不同的属性和定义,开发者可以分别设置这些属性和定义。如果属性是被定义包裹住的,需要先勾上定义才能看到对应的属性。详情请参考 [Pass 可选配置参数](../shader/pass-parameter-list.md) |
2228

23-
Effect 的创建方式跟 Material 的创建方式类似。
29+
**属性检查器** 面板右上方还可以选择其他的模型以预览效果:
2430

25-
![effect-create](material/effect-create.png)
31+
![image](../material-system/img/preview-model-select.png)
2632

27-
创建出来的 Effect 默认是一个 PBR 的 Effect
33+
若修改了材质属性,面板右上角会出现 ![image](../material-system/img/save-material.png) 保存和 ![image](../material-system/img/revert-material.png) 重置按钮。重置会将材质属性回退到上一次保存时的设置,而一旦点击保存后便无法再重置
2834

29-
![effect-show](material/effect-show.png)
35+
## 使用材质
3036

31-
以上就是一个材质的创建流程,更多信息可以参考:[Effect 书写格式与语法](../material-system/effect-syntax.md)
37+
一般情况下,3D 模型、2D 对象以及粒子系统都需要指定材质才可以正确渲染出物体表面的外观。
38+
39+
### 在 3D 模型中使用
40+
41+
通过 [网格/蒙皮网格/批量蒙皮网格渲染器组件](../module-map/mesh/) 上的 `Materials` 属性,我们可以指定当前 3D 模型所使用的材质。点击 `Materials` 属性框右侧的箭头图标按钮,可以看到当前项目中所有的材质资源,根据需要选择即可。或者也可以将所需的材质资源从 **资源管理器** 直接拖拽到 `Materials` 属性框中。
42+
43+
#### 导出模型资源中的材质
44+
45+
通常 [模型资源](./model/mesh.md) 都是由第三方工具制作并导出,然后导入到 Creator 中使用的(支持 FBX 和 glTF 格式)。若模型资源文件中自带了材质资源,则导入后材质为 **只读** 状态,不可编辑。
46+
47+
![fbx-mat](../material-system/img/readonly-material.png)
48+
49+
若要编辑模型资源自带的材质,我们需要先将其提取到模型资源外。<br>在 **资源管理器** 中选中模型资源,然后在 **属性检查器****材质** 分页中勾选 **提取材质**,并设置 **材质提取目录**,最后点击右上角的绿色打钩按钮,即可将模型资源的材质提取到指定目录。详情请参考 [模型资源 - Material 模块](./model/mesh.md#material-%E6%A8%A1%E5%9D%97)
50+
51+
![导出模型](../material-system/img/dump-material.png)
52+
53+
材质提取完成后,会自动和模型节点的网格渲染器组件中的 `Materials` 属性绑定。例如:
54+
55+
材质提取前:
56+
57+
![材质提取前](../material-system/img/dump-result.png)
58+
59+
材质提取后:
60+
61+
![材质提取后](../material-system/img/post-dump.png)
62+
63+
### 在 2D 以及 UI 渲染组件中使用
64+
65+
2D 对象(包括 2D 渲染和 UI 系统)默认情况下只支持一个单独的自定义材质。若留空则会使用引擎内置的标准材质。
66+
67+
若要进行自定义,在组件 **属性检查器上**,通过选择 `Custom Material` 的下拉框选择相应的材质。
68+
69+
![ui-select-mat](../material-system/img/ui-select.png)
70+
71+
### 在粒子系统中使用
72+
73+
粒子系统渲染模块 Renderer 中的 **ParticleMaterial****TrailMaterial** 属性分别用于渲染粒子材质和粒子拖尾,将所需的材质资源从 **资源管理器** 直接拖拽到 **渲染器(Renderer)** 相应的属性框中即可。
74+
75+
![img-particle](../material-system/img/particle-material.png)
76+
77+
详情请参考 [粒子渲染模块](../particle-system/renderer.md)

zh/asset/material/default-effect.png

-74 KB
Loading
25.4 KB
Loading

zh/asset/material/effect-create.png

-187 KB
Loading

zh/asset/material/effect-show.png

-5.92 KB
Loading

zh/asset/material/effects.png

-127 KB
Loading
-73.5 KB
Loading

zh/asset/material/material-create.png

-149 KB
Loading

zh/engine/renderable/model-component.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Creator 提供了几个简单的静态 3D 模型,其中包含了立方体、
6262
关于蒙皮模型的支持及相关设定,参考 [骨骼动画组件](../../animation/skeletal-animation.md#关于动态-Instancing)
6363

6464
另外 instancing 还支持自定义额外的 instanced attributes,可以传递更多不同 instance 之间的差异性数据(比如不同人物间给一个漫反射颜色的外观差异,或大片草地中的风力影响)。<br>
65-
这需要自定义 effect 的支持,更详细的说明可以参考 [语法指南](../../material-system/effect-syntax.md#自定义-Instanced-属性)
65+
这需要自定义 effect 的支持,更详细的说明可以参考 [语法指南](../../shader/effect-syntax.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%A0%E4%BD%95%E4%BD%93%E5%AE%9E%E4%BE%8B%E5%8C%96%E5%B1%9E%E6%80%A7)
6666

6767
### 合并 VB 合批
6868

zh/getting-started/first-game/index.md

+46-18
Original file line numberDiff line numberDiff line change
@@ -918,8 +918,8 @@ export class GameManager extends Component {
918918
@property({type: Prefab})
919919
public cubePrfb: Prefab | null = null;
920920
// 赛道长度
921-
@property
922-
public roadLength = 50;
921+
@property({type: CCInteger})
922+
public roadLength: Number = 50;
923923
private _road: BlockType[] = [];
924924
// 主界面根节点
925925
@property({type: Node})
@@ -929,11 +929,11 @@ export class GameManager extends Component {
929929
public playerCtrl: PlayerController | null = null;
930930
// 关联步长文本组件
931931
@property({type: Label})
932-
public stepsLabel: Label = null!;
932+
public stepsLabel: Label | null = null!;
933933
934934
start () {
935935
this.curState = GameState.GS_INIT;
936-
this.playerCtrl.node.on('JumpEnd', this.onPlayerJumpEnd, this);
936+
this.playerCtrl?.node.on('JumpEnd', this.onPlayerJumpEnd, this);
937937
}
938938
939939
init() {
@@ -958,14 +958,20 @@ export class GameManager extends Component {
958958
case GameState.GS_INIT:
959959
this.init();
960960
break;
961-
case GameState.GS_PLAYING:
962-
this.startMenu.active = false;
963-
this.stepsLabel.string = '0'; // 将步数重置为0
964-
// 设置 active 为 true 时会直接开始监听鼠标事件,此时鼠标抬起事件还未派发
965-
// 会出现的现象就是,游戏开始的瞬间人物已经开始移动
966-
// 因此,这里需要做延迟处理
967-
setTimeout(() => {
968-
this.playerCtrl.setInputActive(true);
961+
case GameState.GS_PLAYING:
962+
if (this.startMenu) {
963+
this.startMenu.active = false;
964+
}
965+
966+
if (this.stepsLabel) {
967+
this.stepsLabel.string = '0'; // 将步数重置为0
968+
}
969+
// 会出现的现象就是,游戏开始的瞬间人物已经开始移动
970+
// 因此,这里需要做延迟处理
971+
setTimeout(() => {
972+
if (this.playerCtrl) {
973+
this.playerCtrl.setInputActive(true);
974+
}
969975
}, 0.1);
970976
break;
971977
case GameState.GS_END:
@@ -992,18 +998,40 @@ export class GameManager extends Component {
992998
}
993999
9941000
// 根据赛道类型生成赛道
1001+
let linkedBlocks = 0;
9951002
for (let j = 0; j < this._road.length; j++) {
996-
let block: Node = this.spawnBlockByType(this._road[j]);
997-
// 判断是否生成了道路,因为 spawnBlockByType 有可能返回坑(值为 null)
998-
if (block) {
999-
this.node.addChild(block);
1000-
block.setPosition(j, -1.5, 0);
1003+
if(this._road[j]) {
1004+
++linkedBlocks;
1005+
}
1006+
if(this._road[j] == 0) {
1007+
if(linkedBlocks > 0) {
1008+
this.spawnBlockByCount(j - 1, linkedBlocks);
1009+
linkedBlocks = 0;
1010+
}
1011+
}
1012+
if(this._road.length == j + 1) {
1013+
if(linkedBlocks > 0) {
1014+
this.spawnBlockByCount(j, linkedBlocks);
1015+
linkedBlocks = 0;
1016+
}
10011017
}
10021018
}
10031019
}
10041020
1021+
spawnBlockByCount(lastPos: number, count: number) {
1022+
let block: Node|null = this.spawnBlockByType(BlockType.BT_STONE);
1023+
if(block) {
1024+
this.node.addChild(block);
1025+
block?.setScale(count, 1, 1);
1026+
block?.setPosition(lastPos - (count - 1) * 0.5, -1.5, 0);
1027+
}
1028+
}
10051029
spawnBlockByType(type: BlockType) {
1006-
let block = null;
1030+
if (!this.cubePrfb) {
1031+
return null;
1032+
}
1033+
1034+
let block: Node|null = null;
10071035
switch(type) {
10081036
case BlockType.BT_STONE:
10091037
block = instantiate(this.cubePrfb);
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# 内置材质
2+
3+
Creator 在 **资源管理器** 面板的 **internal -> default_materials** 目录下内置了几种常见的材质,其使用的 Effect 为 [内置着色器](../shader/effect-builtin.md) ,内置材质的属性都不允许修改。
4+
5+
![内置材质](img/builtin-material.png)
6+
7+
|内置材质|说明|
8+
|:--|:--|
9+
|default-materail| 非透明物体的 [标准材质](../shader/effect-builtin-pbr.md) |
10+
|default-materail-transparent| 半透明物体的 [标准材质](../shader/effect-builtin-pbr.md) |
11+
|particle-add| 标准粒子材质|
12+
|ui-sprite-material| 精灵的标准材质|

0 commit comments

Comments
 (0)