Instancing
实例化(Instancing)的意思是指,在场景中多次绘制同一个物体,但是可以有不同的位置,方向,缩放,材质和贴图等。
我们在绘制相同几何体时,通常不会直接使用每个几何体的世界坐标顶点和索引来绘制,而是使用同一份顶点和索引数据,然后根据不同物体的不同世界坐标,将本地坐标变换成世界坐标再进行绘制。这种做法虽然减少了重复的存储,但每次绘制时依然需要为每个物体设置一个不同的世界坐标矩阵,独特的材质并调用一次Draw命令。而实际上,我们应当尽量减少draw API的调用,因为过多的draw call会加重cpu的负担带来额外的开销。
Direct3D提供一种机制用于绘制大量类似的几何体,这种机制被称为hardware instancing。
这种机制的核心思想是将需要绘制的实例的数据直接存放在顶点缓冲区中,并在每次绘制时使用顶点缓冲区中实例对应的数据。此时着色器代码中的输入顶点结构体可以定义为:
struct VertexIn
{
float3 PosL : POSITION;
float3 NormalL : NORMAL;
float2 Tex : TEXCOORD;
row_major float4x4 World : WORLD;
float4 Color : COLOR;
uint InstanceId : SV_InstanceID;
};
顶点数据可以分为两部分,前三个数据和之前的顶点数据一样,代表缓冲区中每个顶点的坐标,法线和纹理坐标。而后三个数据则是对应每个将要绘制的实例,即每个实例都有一个世界坐标,颜色和实例ID值。这里的InstanceId是系统提供的,第一个实例的id为0以此类推。使用中可以