# MeshRenderer

MeshRenderer即网格渲染器,是所有渲染器的基础,其本身也自带了渲染静态物体的能力。

MeshRenderer是一个组件,所以其可以在 IDE 中创建或者使用代码创建。

# 在 IDE 中

要在 IDE 中创建,只需要选中场景或者 Prefab 中的一个节点,在 Inspector 中添加即可:

创建了之后就可以修改里面的参数:

  1. mesh:网格资源,设置要渲染的网格。
  2. lightMapScaleOffsetlightMapIndex:用于光照贴图,开发者一般无需关心。
  3. castShadow:在相机开启阴影时,是否要产生阴影。
  4. receiveShadow:是否要接受阴影。
  5. materials:设置材质,在 Mesh 有多个 SubMesh 的情况下,可以给每个 SubMesh 设置一个材质。
  6. 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,这在具体的章节中也有论述。