dx9实现Geometry Instancing

为解决引擎批次比较高的问题,通常一个有效的方法是将相同性质的物体顶点组织到一个批次中,一次性渲染;这个方法被称作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()

在实际应用中,对于场景中大面积的静态物体(比如:灌木、草体)等,如果将分散的很开的物体实例加入到一个批次中,则在裁剪的时候会出现一大块草皮突然出现,又突然消失的问题;解决这个问题的方法可以将大块的草皮根据物理分布分割成多个小块,并根据小块中的每个实例计算出小块的质心。

转载于:https://www.cnblogs.com/konlil/archive/2011/01/31/1956649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值