前言
Instance技术其实就是将一个模型实例化成多份的技术,只要向GPU提交一份模型顶点数据和一堆Transform矩阵,就能创建多份相同的模型。因为只需要一个Drawcall,所以如果需要渲染多个相同的模型,用这个方式可以大大提高性能。其原理其实就是向GPU提高两个VertexBuffer,一个是模型的顶点数据,另一个就是Transform矩阵,DX和OpenGL各有各的API来设置第二个VertexBuffer每隔一个Transform矩阵的内存大小分配给一个Instance作为顶点数据。然后调用DX和OpenGL渲染指定个数的Instance。需要注意的是,如果想一个Drawcall搞定,前提是渲染状态要相同,也就意味着相同模型不同材质,没法在一个Drawcall内搞定,就得当两个模型处理。
UE3中的实现
UE3中用到Instance技术的地方其实在它的植被系统中用到,也就是编辑器左侧的树叶按钮对应的系统。最终我们就会找到代码其实是在InstancedFoliage.h当中。
一个模型其实应该对应一个FFoliageMeshInfo,这部分数据记录在EngineFoliageClasses.h的AInstancedFoliageActor当中,由植被系统编辑器维护。当我们想对模型添加一个实例时,只要拿到模型对应的FFoliageMeshInfo,调用AddInstance,就能创建一个实例。
FFoliageMeshInfo其实还维护了FFoliageInstanceCluster数组,FFoliageInstanceCluster的作用就是创建一个簇,一个簇对应一个Drawcall,它维护了一个区域内的所有实例,因为实际应用中,我们不可能把整个世界的实例都在一个Drawcall里渲染,因为这样很多都会在屏幕外,增加了顶点数据传输的浪费。所以才需要有簇,尽可能划分出合理的范围,将一个范围