终于把Shader Instancing加到引擎里去了
大概说一下
因为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就不必这么辛苦了。
因为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就不必这么辛苦了。