材质
了解导入到 Decentraland 的 3D 模型支持哪些材质属性和纹理。
材质被嵌入到一个 .gltf 或 .glb 文件。
本文档指的是作为 3D 模型一部分导入的材质。对于通过代码定义并应用于基本形状的材质,请参阅 材质 .
📔 注意:你目前无法从场景代码中动态更改 3D 模型的材质,除非它是一个基本形状。
着色器支持
并非所有着色器都可用于导入到 Decentraland 的模型中。请确保使用以下之一:
标准材质: 支持任何着色器,例如漫反射、高光、透明度等。
PBR(基于物理的渲染)材质:这种着色器更灵活,因为它包含漫反射、粗糙度、金属度和发光等属性,可让你配置材质与光线的交互方式。
下图显示两个使用相同颜色和纹理创建的相同模型。左侧模型使用了所有 PBR 材质,其中一些包括 金属度, 透明度,以及 发光度。右侧模型使用了所有 标准 材质,其中一些包括 透明度 和 发光度.

目前可与 Decentraland 引擎配合使用的 PBR 属性
基础颜色
金属度
粗糙度
高光
发光
发光强度
Alpha
法线

为了在世界中直观看到这些属性的表现,你可以前往这个 测试世界 来查看不同对象和材质,以及它们如何与灯光和世界环境互动。

基础/漫反射颜色
定义对象表面的基础颜色。它本身不会受到光照影响,因此通常会与粗糙度、金属度、高光等其他节点结合使用。
金属度
金属着色器是用于模拟金属表面外观的一种渲染技术。金属着色器会考虑金属的物理特性及其与光的相互作用,以呈现金属特有的光亮和反射效果。

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

该属性在非金属和金属材质模型之间进行混合。值为 1.0 时,会得到完全的镜面反射,并由基础颜色着色,不包含漫反射或透射。值为 0.0 时,材质由一个漫反射或透射基础层和上方的镜面反射层组成。
高光
在基于物理的渲染(PBR)着色器中,高光属性指的是光线与表面的反射率和光泽度之间的交互。镜面反射是光线在表面上的镜面式反射。在 PBR 中,该属性用于控制表面对光线进行镜面式反射的程度。金属等材质通常具有较高的镜面反射,会产生锐利而明亮的高光;而塑料等非金属材质的镜面反射较低,会产生更宽、更柔和的高光。

Alpha
你可以将材质设置为 透明。透明材质可在不同程度上被看穿,这取决于它们的 透明度。要做到这一点,请启用材质的透明属性,然后将其 透明度 设置为所需数值。Alpha 为 1 会使材质完全不透明,Alpha 为 0 则会使其不可见。
下图显示两个使用标准材质创建的相同模型。左侧仅使用不透明材质,右侧在部分区域同时使用了透明和不透明材质。
💡 请记住,从性能角度来看,使用透明材质始终比使用漫反射材质更耗费资源。请始终尽量将透明材质的使用降到最低。

透明度主要有两种模式: Alpha 裁剪 和 Alpha 混合。主要区别如下:
Alpha 裁剪: Alpha 裁剪会根据灰度值的裁剪阈值,将渲染结果绝对化为 0 或 1。之前的颜色会被表面颜色覆盖,但前提是 alpha 值高于裁剪阈值。

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

🔥优化提示🔥 除非你特别需要一个中间透明度级别, 在渲染性能上始终更优的是使用 _Alpha Clip**,而不是**Alpha 混合_.
⚠️ 排序问题
当你在游戏中使用透明混合模式时,必须考虑颜色混合发生的顺序。这是因为最终输出颜色会受到混合顺序的显著影响。目前,引擎只支持按对象排序,这意味着它会根据对象原点自动对所有透明表面进行排序。不过,目前不支持按片段(像素)排序和按三角形排序。
为避免与排序相关的问题,最好不要在同一个网格上同时使用 alpha clip 和 alpha blend。这有助于防止意外的混合伪影,并确保你的游戏呈现最佳效果。
发光
你也可以将材质设置为 发光。发光材质会发出自身的光。请注意,在渲染时,它们并不会真正照亮场景中的附近对象,只是看起来周围有一圈模糊的光晕。
下图显示两个使用标准材质创建的相同模型。右侧模型的部分表面带有发光的发光材质。


要在 Blender 中让材质发光,只需添加一个 发射 着色器到材质上。
发光强度
发出光的强度。值为 1.0 时,可确保图像中的对象与发光颜色完全相同,即使其“无阴影”。

你可以在 测试世界 查看发光强度在世界中的表现
法线
PBR 着色器中的“normal”节点是用于控制材质表面法线的基本组件。法线是定义某个点处表面垂直方向的向量,它们在决定光线如何与表面交互方面起着至关重要的作用。

顶点绘制
Decentraland 引擎目前不支持 3D 模型的顶点绘制。
材质限制
请注意,每个地块的材质限制为:
log2(n+1) x 20 个场景中的材质数量。它包括作为模型一部分导入的材质。
需要注意的是,每种材质对于每个对象都代表一次 draw call,因此尽量将材质数量保持在最低并尽可能复用材质至关重要,例如使用纹理图集等技术,这也有助于场景中的资源保持统一风格。
材质命名
为了保持有序且健康的美术流程,我们建议正确命名材质。一个方法是使用以下命名规范。
例如,假设我们做了两棵不同的树,一棵是适合春天、会发光的树,另一棵是适合冬天、冰冷且金属感的树。我们可以将材质命名为: "TreeSpring_Emissive_MAT" 以及另一个 "TreeWinter_Metallic_MAT"
总之,
🟢 建议 使用以对象和分类开头的名称: "Wood_Oak_MAT", "SciFiFence_Metallic_MAT"等。
🔴 避免 使用如下名称: "Material009", "material1",这会使场景和模型非常难以追踪和分析。
覆盖 glTF 材质
你可以覆盖一个 glTF 模型的材质,使用 GltfNodeModifiers 组件。请参阅 修改 glTF 材质 了解更多详情。
材质最佳实践
如果你的场景包含多个使用相同纹理的模型,请将纹理作为外部文件引用,而不是将其嵌入 3D 模型中。
嵌入式纹理会为每个模型重复一份,并增加场景体积。 .glb 文件默认会嵌入纹理,但你可以使用 glTF pipeline 将其提取到外部。
注意:在引用一个不会被嵌入的纹理文件后,请确保该文件不会被移动或重命名,否则对该文件的引用将会丢失。该文件也必须位于场景文件夹内,这样它才能随场景一起上传。
设置材质透明度时,请尽量始终使用 Alpha 裁剪 而不是 Alpha 混合,除非你确实需要一个半透明材质(例如玻璃)。这样可以避免引擎将错误的模型渲染到另一个模型前面的问题。
作为经验法则,请记得始终设置 背面剔除 到你的材质中。这会让你的场景性能更好,因为引擎只会渲染模型的可见面。只有在以下情况才取消勾选 背面剔除 :当你需要模型双面渲染时(例如,由 3D 平面制作的树叶组)。

使用 Decentraland 默认纹理 ,这些纹理已由玩家预加载,可让你的资源渲染快得多。
阅读 本文 以了解使用 PBR 纹理于 glTF 模型的完整美术流程的详细概述。
你可以在以下位置找到关于如何使用 Blender 创建与 glTF 兼容材质的详细参考: Blender 文档 .
在以下网站查找免费的高质量 PBR 纹理: cgbookcase .
最后更新于