青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 28,  comments - 15,  trackbacks - 0
『轉(zhuǎn)』OGRE主要渲染流程簡介  

    理解一個渲染引擎,我覺得最重要的是先抓住了它的主架構(gòu),它的主線,渲染流程,不然的話,一個引擎幾萬行,甚至幾十萬行的代碼,光是打開solution就能嚇你一跳了,OGRE也有十幾萬行的代碼量,我一開始看它的時候也是無從下手,感覺代碼太多了,不知道從哪開始看好,這個class看看,那個class看看,由于對整個引擎沒有一個清晰的認(rèn)識,看過了也印象不深,所以,最后,還是決定先找出它的主線,了解它的渲染流程,這樣才能有機(jī)地把各個部分聯(lián)系起來。

    這篇短文也是對OGRE的主要渲染流程的一個介紹,可能對一些class不會太多地去介紹具體的實現(xiàn)細(xì)節(jié)。我所用的代碼都是取自于OGRE的最新的CVS版本。

    讀者最好對OGRE有一定的了解,至少得看懂它的example,不然可能一些東西理解起來比較困難。對D3DOPENGL有一定了解更好。

    如果你看過D3D SDK中帶的例子,你一定知道一個比較簡單的3D程序要運(yùn)行起來,至少都會涉及以下的幾部分:

    首先是數(shù)據(jù)的來源,包括頂點數(shù)據(jù),紋理數(shù)據(jù)等,這些數(shù)據(jù)可以從文件中讀取,也可以在程序運(yùn)行時生成。

    接下來,我們會建立頂點緩沖區(qū)把頂點保存起來,建立texture對象來表示texture,對頂點組成的物體設(shè)置它在世界坐標(biāo)系下的坐標(biāo),設(shè)置攝像機(jī)的位置,視點,設(shè)置viewport的位置和大小,然后就可以在渲染循環(huán)中開始調(diào)用渲染操作了,經(jīng)過了front bufferback buffer的交換,我們就能在屏幕上看到3D圖形了,偽代碼如下:

      setupVertexBuffer

      setWorldTransform

      setCamera

      setProjectionTransform

      setViewport

       beginFrame

      setTexture

      drawObject

      endFrame 

     以下就是渲染一個物體的主要步驟,在我看來,這就是3D程序的主線,同樣道理,無論你多復(fù)雜的渲染引擎,都得實現(xiàn)上述的這些步驟,其他的一些效果如陰影,光照等,都是附著在這條主線上的,所以,如果你能在你所研究的渲染引擎上也清晰地看到這條主線,可能對你深入地研究它會大有幫助,下面,我們就一起來找到OGRE中的這條主線。

     OGRE的渲染循環(huán)都是起源于Root::renderOneFrame,這個函數(shù)在OGRE自帶的example中是不會顯式調(diào)用的,因為example都調(diào)用了Root::startRendering,由startRendering來調(diào)用renderOneFrame,如果你用OGRE來寫真正的游戲,或者編輯器,你可能就需要在的消息主循環(huán)中調(diào)用renderOneFrame了,顧名思義,這個函數(shù)就是對整個OGRE進(jìn)行一幀的更新,包括動畫,渲染狀態(tài)的改變,渲染api的調(diào)用等,在這個函數(shù)中,會包括了我們上述偽代碼的幾乎全部內(nèi)容,所以是本文的重點所在。

     進(jìn)入renderOneFrame,可以看到頭尾兩個fire函數(shù),這種函數(shù)在OGRE中經(jīng)常出現(xiàn),一般都是fire…startfire…end一起出現(xiàn)的,在這些函數(shù)中,可能會處理一些用戶自定義的操作,如_fireFrameStarted就會對所以的frameListener進(jìn)行處理,這些fire函數(shù)可以暫時不用理會,繼續(xù)看_updateAllRenderTargets,在這個函數(shù)中,會委派當(dāng)前所用的renderer對所有創(chuàng)建出來的render target進(jìn)行updaterender target也就是渲染的目的地,一般會有兩種,一種是render texture,一種是render buffer,接著進(jìn)入RenderSystem::_updateAllRenderTargets,可以看到在render system中,對創(chuàng)建出來的render target是用RenderTargetPriorityMap來保存的,以便按照一定的順序來對render target進(jìn)行update,因為在渲染物體到render buffer時,一般會用到之前渲染好的render texture,所以render texture形式的render target需要在render buffer之前進(jìn)行更新。

     進(jìn)入render targetupdate,可以看到,它仍然把update操作繼續(xù)傳遞下去,調(diào)用所有掛在這個render target上的viewportupdate

     Viewport其實就是定義了render target上的一塊要進(jìn)行更新的區(qū)域,所以一個render target是可以掛多個viewport的,以實現(xiàn)多人對戰(zhàn)時分屏,或者是畫中畫等效果,可以把OGRE中的viewport看成是保存camerarendertarget這兩者的組合,把viewport中所定義的camera所看到的場景內(nèi)容渲染到viewport所定義的render target的區(qū)域里。

     Viewport還有一個重要信息是ZOrder,可以看到RenderTarget中的ViewportList帶有一個比較函數(shù),所以在RenderTarget::update中,ZOrder越小的,越先被渲染,所以,如果兩個viewport所定義的區(qū)域互相重疊了,而且ZOrder又不一樣,最終的效果就是ZOrder小的viewport的內(nèi)容會被ZOrder大的viewport的內(nèi)容所覆蓋。

     繼續(xù)進(jìn)入Viewport::update,就像前面所說,它調(diào)用它所引用的camera來渲染整個場景,而在Camera::_renderScene中,是調(diào)用SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)SceneManager::_renderScene里就是具體的渲染流程了。從函數(shù)名稱還有參數(shù)也可以看出來,這個函數(shù)的作用就是利用所指定的cameraviewport,來把場景中的內(nèi)容渲染到viewport所指定的render target的某塊區(qū)域中。根據(jù)camera,我們可以定出view matrixprojection matrix,還可以進(jìn)行視錐剔除,只渲染看得見的物體。注意,我們這里只看標(biāo)準(zhǔn)的SceneManager的方法,不看BspSceneManager派生類的方法,而且,我們會拋開跟主線無關(guān)的內(nèi)容,如對shadowsetup,骨骼動畫的播放,shader參數(shù)的傳遞等,因為我們只注重渲染的主流程。

     在SceneManager::_renderScene中所應(yīng)看的第一個重要函數(shù)是_updateSceneGraphOGRE對場景的組織是通過節(jié)點樹來組織的,一個節(jié)點,你可以看成是空間中的某些變換的組合,如位置,縮放,旋轉(zhuǎn)等,這些變換,會作用到掛接在這些節(jié)點上的具體的物體的信息,也就是說,節(jié)點保存了world transform,對具體的物體,如一個人,在空間中的定位,都是通過操作節(jié)點來完成的。同時節(jié)點還保存了一個世界坐標(biāo)的AABB,這個AABB能容納所有它所掛接的物體的大小,主要是用于視錐裁減的,如果當(dāng)前攝像機(jī)看不見某個節(jié)點的AABB,那么說明攝像機(jī)看不見節(jié)點所掛接的所有物體,所以在渲染時可以對這個節(jié)點視而不見。

     _updateSceneGraph的內(nèi)部處理比較繁瑣,我們只需知道,經(jīng)過了_updateSceneGraph,場景節(jié)點樹中的每個節(jié)點都經(jīng)過了更新,包括位置,縮放,和方位,還有節(jié)點的包圍盒。

     繼續(xù)回到SceneManager::_renderScene,接下來要看的是setViewport,它會調(diào)用具體的renderersetviewport的操作,設(shè)置viewport中所掛接的render target為當(dāng)前所要渲染的目標(biāo),viewport中的區(qū)域為當(dāng)前所要渲染的目標(biāo)中的區(qū)域。

     接下來要碰到OGRE渲染流程中的一個重要的概念,Render Queue。這個東西實在內(nèi)容比較多,還是以后有機(jī)會單獨(dú)提出來說吧,你可以簡單把它想成是一個容器,里面的元素就是renderable,每個renderable可以看成是每次調(diào)用drawprimitive函數(shù)所渲染的物體,可以是一個模型,也可以是模型的一部分。在RenderQueue中,它會按材質(zhì)來分組這些renderable,還會對renderable進(jìn)行排序。

     在每一次調(diào)用SceneManager::_renderScene時,都會調(diào)用SceneManager::prepareRenderQueue來清理RenderQueue,然后再調(diào)用SceneManager::__findVisibleObjects來把當(dāng)前攝像機(jī)所能看見的物體都加入到RenderQueue中。

     SceneManager::__findVisibleObjects是一個遞歸的處理過程,它從場景的根節(jié)點開始,先檢查攝像機(jī)是否能看見這個節(jié)點的包圍盒(包圍盒在_updateSceneGraph時已經(jīng)計算好了),如果看不見,那么這個節(jié)點,還有它的子節(jié)點都不用管了。如果能看見,再檢測掛在這個節(jié)點上的所有MovableObject,如果當(dāng)前所檢測的MovableObject是可見的,就會調(diào)用它的_updateRenderQueue方法,一般在這個方法里就可以把和這個MovableObject相關(guān)的renderable送入RenderQueue了。

     這里要說說MovableObjectMovableObject主要是用于表示場景中離散的物體,如Entity,顧名思義,能移動的物體,不過它的“能移動”這個能力是要通過SceneNode來實現(xiàn)的,所以MovableObject來能顯示出來,首先得先掛接在某個場景節(jié)點上,通過場景節(jié)點來定位。你可以控制MovableObject的一些屬性,如某個MovableObject是否要顯示,是否要隱藏,都可以通過MovableObject::setVisible方法來實現(xiàn)。

     檢測完該節(jié)點上的MovableObject之后,就繼續(xù)調(diào)用所有子節(jié)點的_findVisibleObjects方法,一直遞歸下去。這樣,就能把場景中所有要渲染的renderable所加入到RenderQueue中了。

     至此,我們就擁有了要渲染的物體的信息了,接下來就是對這些物體進(jìn)行渲染了,你會發(fā)現(xiàn)跟D3DOpenGL的代碼很類似的調(diào)用:

       mDestRenderSystem->clearFrameBuffer

      mDestRenderSystem->_beginFrame   

       mDestRenderSystem->_setProjectionMatrix

       mDestRenderSystem->_setViewMatrix

       _renderVisibleObjects();

      mDestRenderSystem->_endFrame();

     這些api的作用和D3D中的類似調(diào)用的作用都差不多,這里再說一下_renderVisibleObjects(),在這個函數(shù)中,會對RenderQueue中的每個renderable進(jìn)行渲染,用的是visitor模式來遍歷操作每個renderable,最終在SceneManager::renderSingleObject中取出每個renderable所保存的頂點,索引,世界矩陣等信息,來進(jìn)行渲染。這其中還包括了查找離該renderable最近的光源等操作,比較復(fù)雜。

     到這里,SceneManager::_renderScene的流程基本走完了,也就是說,OGRE一幀中的渲染流程差不多也結(jié)束了,你應(yīng)該也發(fā)現(xiàn),這個流程跟你用D3D寫一個簡單程序的流程基本是一樣的,在這個流程的基礎(chǔ)上,再去看具體的實現(xiàn),如怎么樣設(shè)置紋理,怎么樣調(diào)用你熟悉的D3DOpenGLAPI來渲染物體,應(yīng)該會簡單得多。

來自:http://m.shnenglu.com/richardhe/articles/68841.html

posted on 2009-06-07 16:39 閆軍yy 閱讀(368) 評論(0)  編輯 收藏 引用 所屬分類: OGRE
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲成人在线| 久久精品日产第一区二区| 欧美成人综合网站| 亚洲视频网站在线观看| 一区二区三区欧美视频| 在线视频免费在线观看一区二区| 99视频在线观看一区三区| av成人免费| 亚洲欧美国产另类| 欧美在线免费观看| 免费不卡视频| 欧美日韩一区在线观看| 久久精品一区二区三区不卡| 欧美日韩三级视频| 欧美人与性动交a欧美精品| 欧美高清视频在线播放| 欧美精品七区| 国产精品日韩欧美一区二区| 国产欧美一区二区精品婷婷| 国产一区自拍视频| 亚洲人成在线观看网站高清| 一本色道久久88综合亚洲精品ⅰ| 欧美一区二区在线观看| 免费不卡视频| 亚洲一区二区三区四区五区黄 | 亚洲视频第一页| 亚洲青涩在线| 欧美日韩亚洲激情| 国产欧美精品一区| 最近中文字幕日韩精品| 亚洲永久免费精品| 久久一区二区视频| 亚洲欧洲另类国产综合| 亚洲国产精品va在线观看黑人| 一本久久综合亚洲鲁鲁五月天| 亚洲欧美日韩另类精品一区二区三区| 蜜臀久久99精品久久久画质超高清| 欧美日韩亚洲系列| 1000部国产精品成人观看| 性欧美在线看片a免费观看| 欧美激情一区二区久久久| 欧美专区中文字幕| 欧美日韩精品一区二区三区四区| 亚洲欧美在线磁力| 久久成人免费视频| 欧美视频一区二区三区| 亚洲国产经典视频| 欧美在线看片| av成人手机在线| 欧美激情精品久久久久久免费印度| 国产亚洲精品aa午夜观看| 亚洲视频在线看| 亚洲欧洲在线看| 久久综合九色综合网站| 韩国精品主播一区二区在线观看| 亚洲欧美日韩精品| aa级大片欧美三级| 欧美日本精品在线| 亚洲精品一区在线观看香蕉| 欧美成年视频| 久久在线免费观看视频| 亚洲第一成人在线| 女仆av观看一区| 久久久久久久久久久一区| 国产中文一区二区| 久久久久久精| 久久久久久9999| 亚洲国产精品一区二区尤物区 | 在线观看欧美| 久久精品国产99| 欧美影院在线| 国产一区二区三区成人欧美日韩在线观看 | 免费在线欧美黄色| 亚洲国产导航| 亚洲国产精品久久久久婷婷老年 | 亚洲欧美日韩综合一区| 中文欧美字幕免费| 国产精品伊人日日| 久久精品国产第一区二区三区最新章节 | 欧美午夜在线一二页| 国产一区二区三区视频在线观看| 欧美国产日韩一区二区在线观看| 久久精品视频免费| 午夜精品久久久| 黄色成人av网| 欧美激情乱人伦| 欧美日韩成人在线| 久久精品视频在线观看| 免费成人av在线| 亚洲一区二区网站| 久久国产精品亚洲va麻豆| 亚洲欧洲日产国码二区| 亚洲已满18点击进入久久| 黄色亚洲网站| 亚洲欧洲一区| 国产精品最新自拍| 欧美电影在线| 国产一区二区三区高清在线观看| 欧美激情精品久久久久久久变态 | 久久久噜噜噜久久中文字免| 亚洲精品黄色| 欧美亚洲免费高清在线观看| 亚洲国产另类精品专区| 亚洲天堂成人在线观看| 亚洲激情电影在线| 亚洲综合视频1区| 99精品热6080yy久久| 欧美在线免费| 亚洲欧美中文在线视频| 狼狼综合久久久久综合网| 午夜精品久久久久久久99热浪潮| 免费永久网站黄欧美| 久久久久久久综合狠狠综合| 欧美日本韩国在线| 欧美激情日韩| 红桃视频亚洲| 欧美一区视频在线| 亚洲永久精品大片| 欧美日韩精品三区| 欧美电影在线观看| 亚洲盗摄视频| 欧美一区二区视频在线观看| 亚洲小说区图片区| 欧美区一区二区三区| 欧美高清视频一二三区| 国产一区亚洲| 亚洲欧美日产图| 亚洲小说欧美另类婷婷| 欧美精品激情在线观看| 欧美电影在线| 亚洲高清二区| 久久久久久9999| 久久一区二区三区av| 国产亚洲精品福利| 亚洲欧美一区二区原创| 性久久久久久久久久久久| 欧美日韩在线精品| 亚洲精品中文字幕女同| 日韩一区二区高清| 免费欧美电影| 一区免费观看| 米奇777在线欧美播放| 亚洲字幕在线观看| 欧美三日本三级三级在线播放| 亚洲高清一区二| 亚洲久久视频| 欧美精品偷拍| av成人黄色| 久久九九精品| 亚洲第一精品在线| 欧美不卡一区| 最新高清无码专区| 亚洲午夜一区二区三区| 欧美日韩在线视频观看| 久久精品国产亚洲精品 | 亚洲无限乱码一二三四麻| 欧美精品一区在线发布| 亚洲日本免费| 一区二区精品国产| 欧美亚男人的天堂| 亚洲欧美韩国| 久久夜色精品亚洲噜噜国产mv| 亚洲国产人成综合网站| 欧美日韩亚洲网| 先锋影院在线亚洲| 亚洲国产高清在线观看视频| 99精品久久| 国产一区二区高清| 免费日韩av| 亚洲午夜一区二区| 欧美1区视频| 久久av红桃一区二区小说| 国产精品一区毛片| 久久全球大尺度高清视频| 亚洲高清不卡在线观看| 亚洲欧美国产一区二区三区| 国内精品美女av在线播放| 欧美激情国产日韩精品一区18| 亚洲免费网址| 亚洲成人在线视频播放| 午夜精品免费在线| 一区二区亚洲欧洲国产日韩| 欧美视频官网| 免费成人美女女| 午夜欧美不卡精品aaaaa| 亚洲第一精品在线| 久久国产88| 中文国产成人精品| 狠狠狠色丁香婷婷综合久久五月 | 日韩香蕉视频| 欧美黄色aa电影| 欧美在线视屏| 亚洲视频视频在线| 亚洲日本中文字幕区| 国产亚洲毛片| 国产精品天天摸av网| 欧美女激情福利| 亚洲婷婷在线| 亚洲精品在线电影| 亚洲第一网站|