为解决引擎批次比较高的问题,通常一个有效的方法是将相同性质的物体顶点组织到一个批次中,一次性渲染;这个方法被称作Geometry Instancing(几何实例化)。 在非固定管线支持2.0以上的显卡上,dx可以硬件支持该技术,具体的实现流程如下:
1. 为物体实例定义属性结构InstanceAttribute(大概包括:位置、法线、颜色等),假设一个批次绘制N个物体实例,则需要申请N*sizeof(InstanceAttribute)个byte的顶点缓冲。
2. 为单个物体实例分配顶点缓冲,这个跟普通的绘制没有区别,即根据顶点格式定义,申请相应大小的顶点缓冲就行了。
3. 在每帧渲染的时候,需要向显卡送入两个顶点流,API调用顺序如下:
SetStreamSourceFreq(0, …, INDEXEDATA|InstNum)SetStreamSourceFreq(1, …, INSTANCEDATA|1)SetStreamSource(0, …..)
SetIndices(…)
SetStreamSource(1, ….)
pEffect->SetTechnique(…)
pEffect->SetMatrix(…) …
pEffect->Begin()
pEffect->BeginPass()
pEffect->DrawPrimitive(…)
pEffect->EndPass()
pEffect->End()
在实际应用中,对于场景中大面积的静态物体(比如:灌木、草体)等,如果将分散的很开的物体实例加入到一个批次中,则在裁剪的时候会出现一大块草皮突然出现,又突然消失的问题;解决这个问题的方法可以将大块的草皮根据物理分布分割成多个小块,并根据小块中的每个实例计算出小块的质心。