转:Ogre的MaterialSystem分析
1. Mesh?、SubMesh、SubEntity和Entity
所有的Mesh對象是由SubMesh構成的,每個SubMesh代表了Mesh對象的一部分,該部分只能使用一種Meterial。如果一個Mesh只采用一種Material,那么它可能只包含一個SubMesh。
當基于Mesh創建出一個Entity時,該Entity由多個SubEntity構建而成,?SubEntity與Mesh中的SubMesh一一對應。可以通過調用Entity::getSubEntity方法獲得SubEntity。一旦得到SubEntity的指針,通過調用setMaterialName方法改變其Material。通過這種方法,可以改變所創建的Entity的默認Materials,從而使創建出來的Entity與眾不同。
class?SubMesh
{
????RenderOperation::OperationType operationType;
????VertexData *vertexData;
????IndexData *indexData;
?
????String mMaterialName;
};
通過代碼可以看到SubMesh是保存頂點和頂點索引的類。
?
class?Mesh:?public?Resource
{
????typedef?std::vector<SubMesh*> SubMeshList;
SubMeshList mSubMeshList;
}
通過代碼可以看到Mesh是收集SubMesh的類。
class?SubEntity:?public?Renderable
{
????String mMaterialName;
????MaterialPtr mpMaterial;
????SubMesh* mSubMesh;
}
通過代碼可以看到SubEntity與SubMesh和Material是一一對應的。
class?Entity:?public?MovableObject,?public?Resource::Listener
{
?MeshPtr mMesh;
?typedef?std::vector<SubEntity*> SubEntityList;
?SubEntityList mSubEntityList;
}
通過代碼可以看到Entity是收集SubEntity和Mesh的類。
?
Entity的可渲染屬性:Entity是由SubEntity組成的,SubEntity是從Renderable繼承而來,所以Entity是可渲染的。
Entity的可移動屬性:Entity是從MovableObject繼承而來,所以Entity是可移動的。
?
概括的來說,Entity和SubEntity是物體渲染特性的入口,而Mesh與SubMesh是物體結構特性(幾何體數據)的入口。
?
?
?
?
?
2. Technique、Scheme?、Pass和Texture Unit
?
Technique和Scheme??
可以說技術和方案是Ogre引擎材質中最強大和活躍的兩個特性。
在Ogre中,每個材質中都至少包含了一種“技術”實現,這種實現允許你對不同性能顯示卡和硬件平臺使用不同的材質屬性組合。簡而言之,技術就是“一種對物體的渲染方法”。通常來說對具體適用哪個渲染技術是由Ogre引擎自動甄選出來的(根據硬件性能、方案以及細節等級等信息),但是如果你希望的話也可以在代碼中完全控制這個過程。
?“方案”是Ogre使用的高級話題之一,事實上它是一個渲染技術集合的描述。舉例來說,你可能有三個不同的技術方案:高質量,中等質量,低質量。在游戲運行的時候,允許用戶通過選擇這三個方案中的任意一個來確定在游戲中具體使用的渲染技術集合。
?
Ogre在渲染的時候,會有一個自動甄選所需渲染技術的固定流程:首先過濾掉那些不在當前方案中的所有技術(默認情況下當前方案是“Default”);然后選擇適配當前細節等級(LoD)的那些;最后在剩下的當中挑選當前硬件環境中可以執行的最優技術(最好效果的)。當Ogre找不到任何一個可以使用的渲染技術時,就會把物體渲染成單調的白色表面。換句話說,如果你看到了一片雪白,就要檢討一下你對材質的配置了。另外在默認的情況下,材質中所有技術的細節等級(LoD)都被設置成為0,也就是最高的細節等級。換句話說,Ogre總是在盡可能的幫助你選擇最優材質技術。
?
???????似乎技術和方案會帶來很多復雜的處理細節。但在實際的執行過程中,你只要在材質腳本中提供了充足的內容,Ogre就會接替你來管理這些瑣碎的細節。當然如果你喜歡,也可以用代碼完成腳本所進行的工作。
?
?
Pass
在Ogre中通路是最基本的渲染單位,同時也是可渲染對象(Renderable)用來標示自己渲染狀態的基本單元。每個可渲染對象都會有自己的材質,Ogre在材質中甄選出最適合當前應用的技術實現。然后把當前技術中所有的“通路”依次放入圖形硬件的渲染通路中。顧名思義,Ogre材質中的“通路”對應于圖形硬件中“渲染通路”的概念。也就是說當前技術中如果包含了3個通路,那么在繪制是用這個材質的模型的時候,在每一幀就要進行3次渲染。
?
在實際的使用中,通路里面還有“紋理單元(texture unit)”的定義,你可以在一個通路中定義任意數量的紋理單元,當然一個不用也是沒問題的。
?
Texture Unit
在Ogre對材質的定義中,紋理單元的概念對應于圖形硬件中的紋理采樣(texture sampler)。為了運行Ogre程序,至少需要一個硬件紋理采樣支持。不過這并不是什么大問題,因為現代的圖形硬件基本上都會有多個紋理采樣,因此我們可以在一次渲染通路的執行中,同時處理多個紋理單元。
?
???????顧名思義,紋理單元里都會包含一張紋理。你可以直接用硬盤中的圖片文件,也可以通過實時的渲染來得到,甚至可以通過一個視頻流來動態生成紋理圖案。在Ogre中并沒有對通路中紋理單元的數量進行限制,這是因為Ogre能根據圖形硬件能力動態拆分通路(這里假設沒有使用硬件著色程序)。具體點說,如果你的圖形硬件只能同時處理4個紋理采樣,但是應用程序卻使用了一個6紋理單元的通路。這時候Ogre會自動的把這個6紋理通路拆分成兩個分別兩次進行渲染,不過雖然最后的渲染結果和預期的一樣,但是仍然是通過兩次渲染通路來實現的,對效率的影響不言自明。
?
?
材質的組成
在下圖中,展示了Ogre的材質之中各種組成成分之間的關系。一份完整的材質至少有一種技術實現,每種技術實現中至少要有一個渲染通路。從圖示中看到材質中包含了N種的技術實現,而在真正的渲染時,只會有一種技術被激活并進入渲染過程(選擇激活技術的工作一般交給Ogre自動完成)。?
??
圖6-2:在Ogre中,材質,技術以及通路之間的關系
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的转:Ogre的MaterialSystem分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exchange Server 2013
- 下一篇: Linux+Apache2.4+PHP5