zoukankan      html  css  js  c++  java
  • Batch、Plant、Geometry & VS

    算是这一阶段的总结吧

            通常场景中会出现需要绘制多个相同模型的情况,普通处理方法是每个模型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出现。程序员、尤其是游戏程序员,好命苦……也很幸福~ ^_^

  • 相关阅读:
    00037_this关键字
    一些Perl例程(全部手打并执行过)
    告别码农生涯
    转载:直面人生的大实话
    iOS sqlite C语言操作
    linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数
    iWatch应用开发-oc篇
    Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结
    (二)用控制器controller给模型数据赋初始值
    PhoneGap开发的android项目环境搭建简单流程
  • 原文地址:https://www.cnblogs.com/oiramario/p/301320.html
Copyright © 2011-2022 走看看