第八章:加载材质

jME3 的图形渲染基于 OpenGL 着色器,而材质(Material)描述了如何使用着色器来渲染3D模型。换句话说,没有材质就无法渲染3D模型。

jME3 的材质使用 .j3md.j3m 文件描述,它们是 jME3 的专有数据格式。一般来说, .j3md 文件应该放在 MyGame/assets/MatDefs 目录下,.j3m 文件应该放在 MyGame/assets/Materials 目录下。

加载.j3md文件

jME3 内置了多种不同的材质,通过加载对应的 .j3md 文件,即可获得一个 Material 实例。

最常用的是这么几个:

  • Common/MatDefs/Misc/Unshaded.j3md,无光,基于纹理着色。
  • Common/MatDefs/Light/Lighting.j3md,基于Blinn-Phong光照模型着色。

下例演示如何加载 jME3 的内置 Unshaded 材质,并将其应用到一个 Geometry 对象上。

// 加载Unshaded材质
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", new ColorRGBA(1, 0, 0, 1));// 设为红色

Geometry geom = new Geometry("Box", new Box(1, 1, 1));
geom.setMaterial(mat);// 应用该材质
rootNode.attachChild(geom);

若想详细了解 JME3 的内置材质,请参考:

加载.j3m文件

.j3md 文件只定义了材质的着色方式,没有定义每个材质参数具体的值,比如:“漫反色”、“高光颜色”等。这些参数的值可以用 .j3m 文件储存。

开发时,一般先由美术人员调整好材质参数,并保存在 .j3m 文件中。程序直接加载 .j3m 文件,就可以直接获得材质对象。

比如前面的代码先加载了 Common/MatDefs/Misc/Unshaded.j3md 材质,然后设置 Color 参数的值为 new ColorRGBA(1, 0, 0, 1)。这个过程就可以用 .j3m 文件来保存。

创建 MyGame/assets/Material/RedColor.j3m 文件,文件内容如下。

Material Red Color : Common/MatDefs/Misc/Unshaded.j3md {
    MaterialParameters {
        Color : 1 0 0 1
    }
}

在代码中直接加载 .j3m 文件。

// 加载红色Unshaded材质
Material mat = assetManager.loadMaterial("Materials/RedColor.j3m");

Geometry geom = new Geometry("Box", new Box(1, 1, 1));
geom.setMaterial(mat);// 应用该材质
rootNode.attachChild(geom);

若想详细了解如何创建 j3m 文件,请参考:

MaterialKey

除了直接通过路径加载材质,还可以使用 MaterialKey 和 loadAsset 方法。

MaterialKey matKey = new MaterialKey("Materials/RedColor.j3m");
Material mat = assetManager.loadAsset(matKey);

MaterialKey 的主要作用是管理缓存,可以通过 assetManager.deleteFromCache(matKey); 方法来释放材质缓存,然后由GC回收。

自定义.j3md

如果你希望模型以其他方式渲染,如:兰伯特(Lambert)光照模型、非真实渲染(NPR)、体渲染等,需要由技术美术(TA)开发对应的 Shader,并创建 .j3md 文件来引用这些 Shader。使用它可以实现自定义Shader。

详细内容,请参考: