• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            的筆記

            隨時隨地編輯

            Ogre中g(shù)rass渲染動態(tài)草體

             

            Ogregrass渲染動態(tài)草體

             

            關(guān)鍵詞:

            StaticGeometry、靜態(tài)幾何體

             

            “看起來似乎靜態(tài)幾何體是活動物體(Moveable Object)的反義詞,但事實上也不全是:通常來說靜態(tài)幾何體會由很多不再活動的活動物體來構(gòu)成。”(Pro OGRE 3D Programming

            中文翻譯版本0.2.0

             

            靜態(tài)物體的幾個缺點(Pro OGRE 3D Programming中文翻譯版本0.2.0):

             

            •巨大的靜態(tài)物體需要在使用前被構(gòu)建,通常這是一個緩慢的過程,所以不能在每一幀都執(zhí)行。

             

            靜態(tài)幾何體將按著放入物體的材質(zhì)來進行分類,并且把材質(zhì)相同的集合體放置到同一個渲染設(shè)置當(dāng)中(換句話說,也就是放到同一個簇中)。但這并不表示只要把一組幾何體打包成一個靜態(tài)物體就能神奇的把它們捆綁到一個渲染設(shè)置中。

             

            •在靜態(tài)幾何體中“靜態(tài)”的含義是:一旦物體被放入靜態(tài)幾何體中,你就不能在單獨移動它了。任何對靜態(tài)幾何體的世界變換都會應(yīng)用到所有里面包含的物體上。

             

            •靜態(tài)幾何體會比同樣大小的活動物體占用更多的內(nèi)存。靜態(tài)幾何體會為每一個實體創(chuàng)建一個網(wǎng)格模型數(shù)據(jù)的拷貝。

             

            •就算在你的視野里(視截體)中看到了整個靜態(tài)幾何體的一小部分,甚至包括在你身后的整個數(shù)據(jù)都會傳到圖形硬件中渲染。

             

            ogre_src_v1-7-2\Samples\Grass\include\Grass.h

            這個注釋很機械,夠參考用了:http://xmchang.bokee.com/4277630.html

             

            StaticGeometry的數(shù)據(jù)分析見后面的“底層數(shù)據(jù)結(jié)構(gòu)分析”。

             

             

            StaticGeometry對象作為動態(tài)草坪,然后在上面附加手繪的grass mesh

             

            步驟:

            1.       創(chuàng)建手繪mesh,命名為“grass”,并加載到Etity中。這是一個創(chuàng)建用戶自定義mesh的方法,稍后再說。

            2.       構(gòu)造靜態(tài)幾何體,并設(shè)置它的參數(shù)。

                 StaticGeometry* mField = mSceneMgr->createStaticGeometry("Field");

             

            3.       將草體Entity加到StaticGeometry靜態(tài)幾何體中,也就是往field中種草

                               mField->addEntity(grass, pos, ori, scale);

             

            4.       執(zhí)行創(chuàng)建。烘焙草體?

                     mField->build(); // build our static geometry (bake the grass into it)

             

            5.       草體隨風(fēng)搖擺。幀循環(huán)中

                     waveGrass(evt.timeSinceLastFrame);  // wave the grass around slowly to simulate wind

             

            手動創(chuàng)建mesh(需補充。。。)

            草體搖動的代碼不是很懂。不是很熟悉靜態(tài)幾何體的結(jié)構(gòu)。(需補充。。。)

             

             

            PagedGeometry中的草體

             

            奧米格得,那不是2句話就能說清楚的,還用了cg。靜止的樹如下渲染:

            1.       創(chuàng)建PagedGeometry對象

            PagedGeometry*     trees = new PagedGeometry();

            2.       創(chuàng)建TreeLoader3D對象,用于加載樹,并加載到PG中。

                 TreeLoader3D *treeLoader = new TreeLoader3D(trees, TBounds(0, 0, 1500, 1500));

                 trees->setPageLoader(treeLoader);    //Assign the "treeLoader" to be used to load geometry for the PagedGeometry instance

            3.       準(zhǔn)備好地形高度表,方便種樹嘛

                 //Setup the height function (so the Y values of trees can be calculated when they are placed on the terrain)

                 HeightFunction::initialize(sceneMgr);

            4.       種樹了。隨機在一個區(qū)域種樹,世界里沒有一顆相同的樹。

             for (int i = 0; i < 20000; i++){

                   yaw = Degree(Math::RangeRandom(0, 360));

             

                   position.x = Math::RangeRandom(0, 1500);

                   position.z = Math::RangeRandom(0, 1500);

                   position.y = HeightFunction::getTerrainHeight(position.x, position.z);

             

                   scale = Math::RangeRandom(0.5f, 0.6f);

             

                   treeLoader->addTree(myEntity, position, yaw, scale);

             }

             

            5.       幀循環(huán)中更新LOD

                 //[NOTE] PagedGeometry::update() is called every frame to keep LODs, etc. up-to-date

                 trees->update();

             

             

             

             

            類關(guān)系

            class BatchedGeometry: public Ogre::MovableObject

            class WindBatchedGeometry: public BatchedGeometry

             

            總結(jié):

            很迷惑,似乎是用的MovableObject,為什么不用StaticGeometryPG實現(xiàn)了一套完整的樹木森林渲染方式,得單獨理解。暫且放下,看看ogitor如何實現(xiàn)的。

             

             

            Ogitor中的草體

            Ogitor 0.4中也是是用的pagedgeometry 1.1.0,和上面分析時使用的一個版本。

            #define PAGEDGEOMETRY_VERSION       "1.1.0"

             

            Ogitor中還用到了moc,暫記之。

             

            CPGInstanceManager

            用于管理pagedgeometry

                class   CBaseEditor: public Ogre::GeneralAllocatedObject

                class   CPGInstanceManager : public CBaseEditor, public MouseListener

             

                class   CPGInstanceEditor : public CBaseEditor

             

             

            加載樹的代碼和上面的介紹一樣,這里找

            bool CPGInstanceManager::load(bool async)

             

            update在這里

            bool CPGInstanceManager::update(float timePassed)

             

            總之還是可以借鑒的。

              

            底層數(shù)據(jù)結(jié)構(gòu)分析

            ---------------------------------------------------------------------------------------------------------------

            內(nèi)存種類

             enum MemoryCategory

             {

                   /// General purpose

                   MEMCATEGORY_GENERAL = 0,

                   /// Geometry held in main memory

                   MEMCATEGORY_GEOMETRY = 1,

                   /// Animation data like tracks, bone matrices

                   MEMCATEGORY_ANIMATION = 2,

                   /// Nodes, control data

                   MEMCATEGORY_SCENE_CONTROL = 3,

                   /// Scene object instances

                   MEMCATEGORY_SCENE_OBJECTS = 4,

                   /// Other resources

                   MEMCATEGORY_RESOURCE = 5,

                   /// Scripting

                   MEMCATEGORY_SCRIPTING = 6,

                   /// Rendersystem structures

                   MEMCATEGORY_RENDERSYS = 7,

             

                  

                   // sentinel value, do not use

                   MEMCATEGORY_COUNT = 8

             };

             

                 This allocation policy uses nedmalloc

                 (http://nedprod.com/programs/portable/nedmalloc/index.html).

                 class NedPoolingPolicy

             

                 template <MemoryCategory Cat> class CategorisedAllocPolicy : public NedPoolingPolicy{};

             

                 typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_GEOMETRY> GeometryAllocPolicy;

            |

                 typedef AllocatedObject<GeometryAllocPolicy> GeometryAllocatedObject;

            |

                 typedef GeometryAllocatedObject      BatchedGeometryAlloc;

             

            值得注意的是,nedprod宣稱: there is no faster portable memory allocator out there! 

            Ned似乎是作者的名字。

             

             

            Policy模式

             


            PagedGeometry插件分析
            http://sxoo0305.blog.163.com/blog/static/10132887201061154455372/

            posted on 2011-05-07 13:48 的筆記 閱讀(1133) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            一级做a爰片久久毛片看看| 97香蕉久久夜色精品国产| 久久久久波多野结衣高潮| 久久影视国产亚洲| 亚洲av日韩精品久久久久久a| 久久久精品国产sm调教网站| 久久综合久久久| 精品国产99久久久久久麻豆| 久久福利青草精品资源站免费| 久久精品国产亚洲Aⅴ香蕉| 亚洲va久久久噜噜噜久久男同| 香港aa三级久久三级| 久久久无码精品亚洲日韩京东传媒| 国产精品久久精品| 久久久久亚洲国产| 国产精品成人精品久久久| 久久久久亚洲AV成人片 | 一97日本道伊人久久综合影院| 亚洲精品无码久久千人斩| 国产午夜精品久久久久九九| 久久婷婷五月综合色高清| 久久笫一福利免费导航| 国产香蕉97碰碰久久人人| 69久久精品无码一区二区| 大香伊人久久精品一区二区| 精品久久久久久久久久中文字幕| 97久久精品国产精品青草| 成人午夜精品无码区久久| 国产精品成人久久久| 久久久精品国产| 久久久久国产精品嫩草影院| 欧美亚洲国产精品久久久久| 久久久久亚洲精品中文字幕| 国产日韩欧美久久| 久久久久久久久久久免费精品| 99久久精品无码一区二区毛片 | 亚洲精品NV久久久久久久久久| 国产精品免费久久久久影院 | 久久这里只有精品首页| 麻豆国内精品久久久久久| 久久这里只有精品首页|