ogre Mesh的渲染流程

2022-05-03 06:21:07 字數 4205 閱讀 2944

首先乙個

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和使用者 解析成樣式結構...