大概说一下
因为ShaderConst数量有限
1. VS1.0中有96个
2. VS2.0中有256个
每个是一个float4,所以可供描述Instance的信息量有限
根据不同需要,实现分为3种:
1. 需要3个轴Rotation和Translate的物件,使用float4x4描述一个Instance
VS1.0一个Batch可以提交20个,VS2.0是60个
2. 需要Translate和y轴Rotation,使用float4描述一个Instance,xyz是position,w是rotation
VS1.0一个Batch可以提交80个,VS2.0是240个
3. 植物,使用float4描述一个Instance,xyz是position,w是sway
VS1.0一个Batch可以提交80个,VS2.0是240个
顺便,在计算mvp时,直接忽略掉view matrix,即是billboard ^_^
我在计算时都减去了16,预留给其他的uniform。
而Instance index我没有修改Vertex的格式,而是直接插在了Diffuse.r中,取的时候int index = int(diffuse.r * 256);就好了。
当然,如果是SM3.0就不必这么辛苦了。
posted on 2005-12-14 11:01
千里马肝 阅读(454)
评论(6) 编辑 收藏
评论
是SHADER INSTANCING是类似SM3.0里的几何实例的东东吧。:D
你指的应该是Geometry Instancing
我这里做的是使用Shader const尽量一次更多得提交相同模型
具体的在DxSDK中有一个sample
嗯,Geometry Instancing是利用VB来传送每个实例的信息。
确切得说
VB里保存的是“一堆”相同的数据
不同的是可能用Texcoord1.x存index之类
然后用shader const数组存放每个instance的信息
这种做法,支持不了skin是否?大概可以认为是static instancing技术.至于这种技术的局限,请参见gpu gems 2的第三章,不细说了。gameres上所述的,也不再回了。:)
想要在< sm3.0的平台下做instancing
要么Vendor在sm2.0基础上给你留有后门可入
要么在有限的寄存器上
你做的动作越多
可以Instancing的数目就越少