首先乙個
entity
物件必須
attach
到乙個scenenode。1.
建立乙個
scenenode
:scenemanager::getrootscenenode()
(在scenemanager::init
時會建立乙個
rootnode)à
scenenode::createchildscenenode()
ànode::createchild()
主要的操作在這個函式中完成,首先呼叫虛函式
scenenode::createchildimpl
(),此函式又會呼叫
octreescenemanager::createscenenode
(),此函式會
new乙個
scenenode
的派生類物件,這裡是
octreenode
,並加入到
scenenodelist mscenenodes
中;隨後又進行了座標變換;最後將此指標又加入到
childnodemap mchildren
中,然後返回此指標;2.將
entity attach
到scenenode
:scenenode:: attachobject();3.
渲染從root::startrendering()
函式開始,此函式啟動乙個迴圈,每次執行
root::renderoneframe()à
root::_updateallrendertargets
àrendersystem::_updateallrendertargets()
àrenderwindow::update()
àd3d9renderwindow::update(bool swap)
àrendertarget::update()
àviewport::update()
àcamera::_renderscene()
àscenemanager::_renderscene(camera* camera, viewport* vp, bool includeoverlays)
4.繞了好大一圈,才來到了
scenemanager::_renderscene()
,此函式想必是渲染的主要操作所在;
5.scenemanager:: _updatescenegraph()
從root node
開始遞迴的呼叫了所有
scene node
的update
,主要是計算了
transform;6.
給autoparamdatasource
設定了一系列引數,這個類是用來為
gpu programs
提供一些引數的;
7.scenemanager::preparerenderqueue
()。這裡有乙個
ogre
場景管理的概念
renderqueue
。粗略的看,這個類主要是為了把
objects
按照材質分組,它還將管理物件的渲染優先權;
8.octreescenemanager::_findvisibleobjects()à
octreescenemanager::walkoctree
àoctreenode::_addtorenderqueue
如果想顯示包裹盒的話,則會呼叫
」 sn->_addboundingboxtoqueue(queue);」
可見這個操作利用
scenemanager
的空間管理演算法來對所有的
scenenode
進行了可見性判斷,如果可能可見,則加入到
renderqueue
中;9.
在計算好了
renderqueue
之後,開始呼叫
rendersystem
的一系列函式,例如
_setprojectionmatrix
等等開始為真正的渲染操作做好準備;
10.scenemanager::_rendervisibleobjects
,渲染操作就在這裡了。
àscenemanager::rendervisibleobjectsdefaultsequence
àscenemanager::_renderqueuegroupobjects
àscenemanager::renderbasicqueuegroupobjects
(此函式遍歷
renderqueuegroup
中的每個
renderprioritygroup
,然後先渲染
solids
,再渲染
transparents)à
scenemanager::scenemgrqueuedrenderablevisitor::visit
11.à
scenemanager::rendersingleobject
,此函式設定了燈光、
gpu programs
,然後使用乙個
renderoperation
物件來呼叫
d3d9rendersystem::_render
,也就是真正的
draw call
。renderoperation
物件是由
subentity::getrenderoperation
àsubmesh::_getrenderoperation
來設定的,主要是
indexdata
和vertexdata
。這裡有幾個細節需要注意:1.在
scenemanager::renderobjects
函式中用到了乙個
visitor
模式來訪問
queuedrenderablecollection
(這個類的例項用來在
renderprioritygroup
中包括solids
、transparents
等等)。
2.entity
是從moveableobject
派生的,而
subentity
才是從renderable
派生的;
3.乙個
scenenode
可以attach
多個entity
;實際上
scenenode
可以attach
任何的moveableobject;4.
前面只提到了
indexdata
和vertexdata
,而對於渲染來說
material
更是關注的焦點,
mesh
的材質是如何與
rendersystem
互動的呢?
總結:scenemanager
進行可見性判斷之後,形成乙個
renderqueue
,然後對於佇列中的每個
object
再使用renderopertation
與rendersystem
聯絡,來執行渲染操作。
總體感覺有些地方相當複雜,有些覺得比較羅索,例如通過
root
然後找到
rendertarget
然後知道
viewport
,再找到
camear
,最後才執行到
scenemanager
的渲染函式,為什麼不把
viewport
做完scenemanaer::_renderscene
的乙個引數,交給上層來控制呢?畢竟多數程式要乙個
renderwindow
,乙個viewport
就夠了。又比如
renderqueue
(見下圖),不知道是不是因為要處理
shadow
等才搞得這麼複雜。
對於objects
按照material
分組,然後對於每個
group
再先顯然
solids
再渲染transparents
,這種透明處理方式明顯是不安全的,如果兩個組中都有透明物體,那畫面肯定會出問題的。
Unity的渲染流程
unity中座標空間的轉換 unity的渲染流程 渲染到裝置螢幕的每一幀畫面都要經歷如下幾個階段 應用程式階段 cpu 將材質和模型資料傳送給gpu 幾何階段 gpu 進行頂點變換計算 光柵化 gpu 將三角形轉化為片元,並對片元著色。cpu 準備需要渲染的物件。把可視的物件,進行遮擋剔除和視椎體剔...
OGRE Mesh的使用方法
在ogre中,動態建立mesh一般有兩種方法 其一,通過manualobject的converttomesh,建立manualobject是中間過程,converttomesh過後,此建立的manualobject就可以remove掉了 其二,通過hardwarebuffer直接建立mesh。第一種...
頁面渲染流程
1.瀏覽器把獲取到的html 解析成1個dom樹,html中的每個tag都是dom樹中的1個節點,根節點就是我們常用的document物件。dom樹里包含了所有html標籤,包括display none隱藏,還有用js動態新增的元素等。2.瀏覽器把所有樣式 使用者定義的css和使用者 解析成樣式結構...