> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-zh/3d-jian-mo-he-dong-hua/materials.md).

# 材质

了解导入到 Decentraland 的 3D 模型支持哪些材质属性和纹理。

材质被嵌入到一个 *.gltf* 或 *.glb* 文件。

{% hint style="info" %}
**💡 提示**: 安装 [Decentraland Tools Blender 插件](https://extensions.blender.org/add-ons/decentraland-tools/)。它包含一些实用功能，可帮助你编辑和导出 3D 模型、穿戴物和表情动作。
{% endhint %}

本文档指的是作为 3D 模型一部分导入的材质。对于通过代码定义并应用于基本形状的材质，请参阅 [**材质**](https://docs.decentraland.org/creator/development-guide/materials/) .

{% hint style="warning" %}
**📔 注意**：你目前无法从场景代码中动态更改 3D 模型的材质，除非它是一个基本形状。
{% endhint %}

## 着色器支持

并非所有着色器都可用于导入到 Decentraland 的模型中。请确保使用以下之一：

* **标准材质：** 支持任何着色器，例如漫反射、高光、透明度等。
* **PBR（基于物理的渲染）材质**：这种着色器更灵活，因为它包含漫反射、粗糙度、金属度和发光等属性，可让你配置材质与光线的交互方式。

下图显示两个使用相同颜色和纹理创建的相同模型。左侧模型使用了所有 *PBR* 材质，其中一些包括 *金属度*, *透明度*，以及 *发光度*。右侧模型使用了所有 *标准* 材质，其中一些包括 *透明度* 和 *发光度*.

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-738840e87d1016d69373d87362184c128540bb34%2F30-materials.png?alt=media)

### 目前可与 Decentraland 引擎配合使用的 PBR 属性

> * 基础颜色
> * 金属度
> * 粗糙度
> * 高光
> * 发光
> * 发光强度
> * Alpha
> * 法线

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-4f7c30911e7f3f423d3bf4232caf391c4f3c21ea%2F60-principledBSDF.png?alt=media)

为了在世界中直观看到这些属性的表现，你可以前往这个 [测试世界](decentraland://?realm=TestEnvironment.dcl.eth) 来查看不同对象和材质，以及它们如何与灯光和世界环境互动。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-59533ef54ae1e8b023b1aac7c29c2e946bee5c6c%2F55-testing-environment.png?alt=media)

### 基础/漫反射颜色

定义对象表面的基础颜色。它本身不会受到光照影响，因此通常会与粗糙度、金属度、高光等其他节点结合使用。

### 金属度

金属着色器是用于模拟金属表面外观的一种渲染技术。金属着色器会考虑金属的物理特性及其与光的相互作用，以呈现金属特有的光亮和反射效果。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-72df7dbe44a99add0601d2210ac6c8158cec7bd1%2F61-metallic-material.png?alt=media)

### 粗糙度

粗糙度材质与光线如何与材质表面交互的真实模拟有关。通常会使用粗糙度贴图为模型表面提供一系列“光滑”或“粗糙”的变化。一般会使用灰度值纹理贴图来提供这类信息。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-9b8a24c451b1e14c95191185dccb686499f8a4ac%2F63-roughness.png?alt=media)

该属性在非金属和金属材质模型之间进行混合。值为 1.0 时，会得到完全的镜面反射，并由基础颜色着色，不包含漫反射或透射。值为 0.0 时，材质由一个漫反射或透射基础层和上方的镜面反射层组成。

### 高光

在基于物理的渲染（PBR）着色器中，高光属性指的是光线与表面的反射率和光泽度之间的交互。镜面反射是光线在表面上的镜面式反射。在 PBR 中，该属性用于控制表面对光线进行镜面式反射的程度。金属等材质通常具有较高的镜面反射，会产生锐利而明亮的高光；而塑料等非金属材质的镜面反射较低，会产生更宽、更柔和的高光。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-912bbeaffb8c4725d9f60b946fc7fe5775df37bb%2F62-specular.png?alt=media)

### Alpha

你可以将材质设置为 *透明*。透明材质可在不同程度上被看穿，这取决于它们的 *透明度*。要做到这一点，请启用材质的透明属性，然后将其 *透明度* 设置为所需数值。Alpha 为 1 会使材质完全不透明，Alpha 为 0 则会使其不可见。

下图显示两个使用标准材质创建的相同模型。左侧仅使用不透明材质，右侧在部分区域同时使用了透明和不透明材质。

{% hint style="warning" %}
💡 请记住，从性能角度来看，使用透明材质始终比使用漫反射材质更耗费资源。请始终尽量将透明材质的使用降到最低。
{% endhint %}

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-694975c9963d924b8da300a18d8a47e2025e1fdb%2F31-transparent-materials.png?alt=media)

透明度主要有两种模式： *Alpha 裁剪* 和 *Alpha 混合*。主要区别如下：

* **Alpha 裁剪：** Alpha 裁剪会根据灰度值的裁剪阈值，将渲染结果绝对化为 0 或 1。之前的颜色会被表面颜色覆盖，但前提是 alpha 值高于裁剪阈值。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b8eaf93cbe426a7c331301aed0a8da693bae547c%2F33-alpha-clip.png?alt=media)

* **Alpha 混合：** Alpha 混合会在 0 和 1 之间插值。你可以使用 alpha 混合将表面颜色叠加在之前的颜色之上。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-87bb91f45cccee6600d3251887c7ae629b726336%2F34-alpha-blend.png?alt=media)

{% hint style="warning" %}
**🔥优化提示🔥** 除非你特别需要一个中间透明度级别， **在渲染性能上始终更优的是使用 \_Alpha Clip***\*\*，而不是\*\****Alpha 混合**\_**.**
{% endhint %}

{% hint style="warning" %}
**⚠️ 排序问题**

当你在游戏中使用透明混合模式时，必须考虑颜色混合发生的顺序。这是因为最终输出颜色会受到混合顺序的显著影响。目前，引擎只支持按对象排序，这意味着它会根据对象原点自动对所有透明表面进行排序。不过，目前不支持按片段（像素）排序和按三角形排序。

为避免与排序相关的问题，最好不要在同一个网格上同时使用 alpha clip 和 alpha blend。这有助于防止意外的混合伪影，并确保你的游戏呈现最佳效果。
{% endhint %}

### 发光

你也可以将材质设置为 *发光*。发光材质会发出自身的光。请注意，在渲染时，它们并不会真正照亮场景中的附近对象，只是看起来周围有一圈模糊的光晕。

下图显示两个使用标准材质创建的相同模型。右侧模型的部分表面带有发光的发光材质。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-116cf9169c3fda356bf068bd4cab46462e0828fe%2F34-emissive-materials.png?alt=media) ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-bdb40cfa388909cc3ada13c89fff4b3aa9b5f46e%2F35-emissive-nodes.png?alt=media)

*要在 Blender 中让材质发光，只需添加一个 `发射` 着色器到材质上。*

### 发光强度

发出光的强度。值为 1.0 时，可确保图像中的对象与发光颜色完全相同，即使其“无阴影”。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-d7442e553d308821f6f2069fced7e8139a562396%2F52-emissive-materials.png?alt=media)

*你可以在* [*测试世界*](decentraland://?realm=TestEnvironment.dcl.eth) *查看发光强度在世界中的表现*

### 法线

PBR 着色器中的“normal”节点是用于控制材质表面法线的基本组件。法线是定义某个点处表面垂直方向的向量，它们在决定光线如何与表面交互方面起着至关重要的作用。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-13d87ebefb8dbb8b4ddc2d72b2d6d3db7181872f%2F50-normal.gif?alt=media)

## 顶点绘制

Decentraland 引擎目前不支持 3D 模型的顶点绘制。

## 材质限制

请注意，每个地块的材质限制为：

> log2(n+1) x 20 个场景中的材质数量。它包括作为模型一部分导入的材质。

需要注意的是，每种材质对于每个对象都代表一次 draw call，因此尽量将材质数量保持在最低并尽可能复用材质至关重要，例如使用纹理图集等技术，这也有助于场景中的资源保持统一风格。

## 材质命名

为了保持有序且健康的美术流程，我们建议正确命名材质。一个方法是使用以下命名规范。

```
<Object>_<Classification>_<Sub-Classification(optional)>_<_MAT>
```

例如，假设我们做了两棵不同的树，一棵是适合春天、会发光的树，另一棵是适合冬天、冰冷且金属感的树。我们可以将材质命名为： *"TreeSpring\_Emissive\_MAT"* 以及另一个 *"TreeWinter\_Metallic\_MAT"*

总之，

* 🟢 **建议** 使用以对象和分类开头的名称： *"Wood\_Oak\_MAT"*, *"SciFiFence\_Metallic\_MAT"*&#x7B49;。
* 🔴 **避免** 使用如下名称： *"Material009"*, *"material1"*，这会使场景和模型非常难以追踪和分析。

## 覆盖 glTF 材质

你可以覆盖一个 *glTF* 模型的材质，使用 [GltfNodeModifiers](/creator/content-creator-zh/chang-jing-sdk7/3d-nei-rong-ji-chu/materials.md#modify-gltf-materials) 组件。请参阅 [修改 glTF 材质](/creator/content-creator-zh/chang-jing-sdk7/3d-nei-rong-ji-chu/materials.md#modify-gltf-materials) 了解更多详情。

## 材质最佳实践

* 如果你的场景包含多个使用相同纹理的模型，请将纹理作为外部文件引用，而不是将其嵌入 3D 模型中。

嵌入式纹理会为每个模型重复一份，并增加场景体积。 *.glb* 文件默认会嵌入纹理，但你可以使用 [**glTF pipeline**](https://github.com/AnalyticalGraphicsInc/gltf-pipeline) 将其提取到外部。

> 注意：在引用一个不会被嵌入的纹理文件后，请确保该文件不会被移动或重命名，否则对该文件的引用将会丢失。该文件也必须位于场景文件夹内，这样它才能随场景一起上传。

* 设置材质透明度时，请尽量始终使用 *Alpha 裁剪* 而不是 *Alpha 混合*，除非你确实需要一个半透明材质（例如玻璃）。这样可以避免引擎将错误的模型渲染到另一个模型前面的问题。
* 作为经验法则，请记得始终设置 *背面剔除* 到你的材质中。这会让你的场景性能更好，因为引擎只会渲染模型的可见面。只有在以下情况才取消勾选 *背面剔除* ：当你需要模型双面渲染时（例如，由 3D 平面制作的树叶组）。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-8039927ba106b4fd2df524ed0986d877aca0a70e%2F59-backface-culling.png?alt=media)

* 使用 Decentraland [**默认纹理**](https://github.com/decentraland/builder-assets/tree/master/textures) ，这些纹理已由玩家预加载，可让你的资源渲染快得多。
* 阅读 [**本文**](https://www.khronos.org/blog/art-pipeline-for-gltf) 以了解使用 PBR 纹理于 glTF 模型的完整美术流程的详细概述。
* 你可以在以下位置找到关于如何使用 Blender 创建与 glTF 兼容材质的详细参考： [**Blender 文档**](https://docs.blender.org/manual/en/latest/addons/import_export/scene_gltf2.html) .
* 在以下网站查找免费的高质量 PBR 纹理： [**cgbookcase**](https://cgbookcase.com/) .


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-zh/3d-jian-mo-he-dong-hua/materials.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
