# MeshRenderer
MeshRenderer即网格渲染器,是所有渲染器的基础,其本身也自带了渲染静态物体的能力。
MeshRenderer是一个组件,所以其可以在IDE中创建或者使用代码创建。
# 在IDE中
要在IDE中创建,只需要选中场景或者Prefab中的一个节点,在Inspector中添加即可:
创建了之后就可以修改里面的参数:
mesh
:网格资源,设置要渲染的网格。lightMapScaleOffset
和lightMapIndex
:用于光照贴图,开发者一般无需关心。castShadow
:在相机开启阴影时,是否要产生阴影。receiveShadow
:是否要接受阴影。materials
:设置材质,在Mesh有多个SubMesh的情况下,可以给每个SubMesh设置一个材质。dynamicBatch
:是否要开启动态合批,详见合批。
# 在代码中
也可以在代码中创建一个MeshRenderer:
const mr = entity.addComponent(engine.MeshRenderer);
创建了以后,上述所有的参数都可以直接用mr.castShadow = true;
这样的方式来设置,但还有一些特殊的通用方法,并且有一些要注意的地方。
# 通用方法
首先是材质相关,在运行时开发者经常需要去获取一个MeshRenderer的Material来修改像是Uniform这样的信息,这里有完全截然不同的两种做法:
// 获取某个SubMesh的材质,**会进行拷贝**!
mr.getMaterialAtIndex(index);
// 等价于`mr.getMaterialAtIndex(0);`
mr.material
// 获取材质但不进行拷贝。
mr.getSharedMaterialAtIndex(index);
// 等价于`mr.getSharedMaterialAtIndex(0);`
mr.sharedMaterial
这两个方法的区别在于是否要进行拷贝,如果用第一种方法,则会产生一份拷贝,后续的修改都针对于这个MeshRenderer本身;而第二种方法则不会拷贝,对获取的Material修改将会影响所有拥有此原始材质的组件。
这里要特别注意的是要开启GPU实例化或合批必须使用sharedMaterial
,这在具体的章节中也有论述。