算是这一阶段的总结吧
通常场景中会出现需要绘制多个相同模型的情况,普通处理方法是每个模型1个Vertex Buffer,使用1个DrawPrimitive(或是OpenGL中的DrawElements),这样过多的DP调用会限制FPS,于是就有了xxx Instancing的方法,如此引发出一系列的思考。
Batch
以当前ShaderConst个数为单位,分配一个VB,空间大小 = 单个Instance的大小 x Number。其中Number的大小视每个Instance的信息量为参考。然后在Draw之前,每个Instance在Attach时将个人信息提交上来,最后在Draw的时候,DP的调用次数可以减少到 Instance个数 / Number (+1)。
Plant
延伸出的一个典型:场景中会有大量的花、草,它们会“随风摇摆”。于是乎,它们是最适合使用Instancing的技术,至于摇摆,使用shader模拟会比使用Dynamic Buffer帧动画效率来得高很多。
Geometry
需要注意的问题,在准备Batch所需要的VB时,因为要写入index的信息,而且Index Buffer也要调整,所以要注意重组后的数据正确。
VS
因为要检查ShaderConst的数量支持,所以想当然得直接取Caps.MaxVertexShaderConst,而Instancing需要写shader,测试了一下,发现VS1.0(1.1)有96个,VS2.0有256个,于是提供2个版本,然后程序根据配置自动选择。
没那么简单,在GF3以下或GF4MX使用模拟VS的情况下,如果是SOFTWARE_VERTEXPROCESSING,其个数是8192,VS版本是3.0 …… 好吧,那就判断是HW还是SW。
暂时OK,过了一会儿,测试人员叫道:怎么什么东西都没有了?!?!!一看,的确没有,想一想,哇靠,他的显卡是ATI 9000,查一下Caps,晕倒,ShaderConst竟然是192,VS1.1,吐血ing~ 只好再加一个版本……
感悟:一个新技术,在由DEMO转为实用,需要考虑更多的东西,也由于PC平台的原故,相对Console需要注意更多的Exception出现。程序员、尤其是游戏程序员,好命苦……也很幸福~ ^_^
posted on 2005-12-21 09:42
千里马肝 阅读(632)
评论(4) 编辑 收藏
评论
哈,常量寄存器的数目对于不同硬件各不相同确实是个头痛的事。
不过我觉得最好还是根据硬件情况和实例数目来动态选择走哪个渲染PATH。用SHADER是可以模拟出同固定渲染管线一摸一样的光照效果的。:D
因为涉及到ShaderConst个数
所以已经无法根据vs版本选择profile
故目前是按照个数决定是用哪个shader
同感于博主
NV20和R200对于很多游戏来说确实是处于很尴尬的位置
To IS —。—
理想和现实还是有一定差距的……
谁叫ATI非要显得比NV牛B呢,搞个192出来
Dx10不是就要求“必须实现”吗
所以我想等Dx10普及了,IS美好的愿望就应该可以实现了
不过可能是monkey year horse month的事情了