算是这一阶段的总结吧

        通常场景中会出现需要绘制多个相同模型的情况,普通处理方法是每个模型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)  编辑 收藏

  回复  引用  查看    
2005-12-21 19:22 | Pointer      
哈,常量寄存器的数目对于不同硬件各不相同确实是个头痛的事。
不过我觉得最好还是根据硬件情况和实例数目来动态选择走哪个渲染PATH。用SHADER是可以模拟出同固定渲染管线一摸一样的光照效果的。:D
  回复  引用  查看    
2005-12-22 13:51 | 千里马肝      
因为涉及到ShaderConst个数
所以已经无法根据vs版本选择profile
故目前是按照个数决定是用哪个shader
  回复  引用  查看    
2005-12-23 13:13 | chaz      
同感于博主
NV20和R200对于很多游戏来说确实是处于很尴尬的位置

To IS —。—
理想和现实还是有一定差距的……
  回复  引用  查看    
2005-12-23 15:24 | 千里马肝      
谁叫ATI非要显得比NV牛B呢,搞个192出来

Dx10不是就要求“必须实现”吗
所以我想等Dx10普及了,IS美好的愿望就应该可以实现了
不过可能是monkey year horse month的事情了

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
 





<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

与我联系

常用链接

留言簿(33)

我参与的团队

我的标签

随笔档案(295)

文章档案(1)

好友

搜索

  •  

最新评论

阅读排行榜

评论排行榜

60天内阅读排行