第八章:加载材质
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。
详细内容,请参考: