> 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-yu-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 的模型中。请确保使用以下之一：

* **标准材质：** 支持任意着色器，例如 diffuse、specular、transparency 等。
* **PBR（基于物理的渲染）材质**：这种着色器更灵活，因为它包含 diffuse、roughness、metalness 和 emission 等属性，可让你配置材质与光线的交互方式。

下图展示了两个相同的模型，它们使用了相同的颜色和纹理。左侧模型使用了全部 *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\&token=95bf7877-e0b9-4633-8ea4-b05b0701cb84)

### 目前可与 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\&token=9b405e12-51d2-4624-bc81-e7bbcba52b04)

为了直观了解这些属性在场景中的表现，你可以前往这个 [测试世界](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\&token=c5a58e89-8858-44d4-9bf6-2020c2a865f2)

### 基础/漫反射颜色

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

### 金属度

金属着色器是一种用于模拟金属表面外观的渲染技术。金属着色器会考虑金属的物理特性以及它们与光线的交互方式，从而产生金属特有的光泽和反射效果。

![](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\&token=dbe9ebe8-ffe6-495c-b5b4-84f3476f99d2)

### 粗糙度

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

![](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\&token=985a3a6a-48ca-49b9-95ec-29c3bb90c6f5)

此属性在非金属和金属材质模型之间进行混合。值为 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\&token=a4191c28-b26d-47e3-acd3-881bcbfe7932)

### Alpha

你可以将材质设置为 *透明*。透明材质可以在不同程度上被看穿，这取决于其 *alpha*。要这样做，请启用材质的透明度属性，然后将其 *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\&token=1e3e274e-aa56-42cb-ad6b-55aa737ce3fa)

主要有两种不同的透明模式： *Alpha Clip* 和 *Alpha Blend*。主要区别如下：

* **Alpha Clip：** Alpha Clip 会根据灰度值的裁剪阈值，将数值绝对渲染为 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\&token=42ae0e0d-cfaf-4326-b977-96dad3aa0ae2)

* **Alpha Blend：** Alpha Blend 会在 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\&token=ceb355aa-473d-41d9-8b85-c592709dda6b)

{% hint style="warning" %}
**🔥优化提示🔥** 除非你明确希望拥有中间透明度级别， **否则在渲染性能上始终使用 \_Alpha Clip***\*\* 而不是 \*\****Alpha Blend**\_**.**
{% 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\&token=f7d29865-054f-4af2-8332-921865b00577) ![](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\&token=5981d050-b6c3-47a9-b245-63274e7489ed)

*要在 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\&token=2f790c5f-b75f-45ad-afea-1c2d3cec2ef8)

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

### 法线

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

![](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\&token=ed3eb3fa-ce46-43ed-aa87-fc7e2e865bf9)

## 顶点绘画

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

## 材质限制

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

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

重要的是要考虑到，每种材质都代表每个对象的一次绘制调用，因此尽量将材质数量保持在最低限度，并通过使用纹理图集等技术尽可能复用材质，这也会让你的场景在资源之间呈现出更统一的风格。

## 材质命名

为了构建有组织且健康的美术流程，我们建议正确命名你的材质。一个做法是使用以下命名约定。

```
<对象>_<分类>_<子分类(可选)>_<_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 clip* 而不是 *Alpha blend*，除非你确实需要一个部分透明的材质（比如玻璃）。这样可以避免引擎把错误的模型渲染在另一个模型前面的问题。
* 作为一条经验法则，请记住始终在你的材质中设置 *背面剔除* 。这样可以让你的场景更高效，因为引擎只会渲染模型可见的一面。只有在 *背面剔除* 的情况下才取消勾选，即当你需要一个模型两面都被渲染时（例如，由 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\&token=6d513fca-f727-4178-87c9-4efe7f0a26ed)

* 使用 Decentraland [**默认纹理**](https://github.com/decentraland/builder-assets/tree/master/textures) ，它们已由玩家预加载，这能让你的资产渲染快得多。
* 阅读 [**本文**](https://www.khronos.org/blog/art-pipeline-for-gltf) ，可详细了解一个使用 glTF 模型中的 PBR 纹理的完整美术流程。
* 你可以在以下位置找到关于如何使用 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
