MOGRE學習筆記(2) - MOGRE基礎知識總結

  前一篇配置了MOGRE的運行環境,這裏記錄一些MOGRE基礎知識,僅僅是最基礎的一些東西。因爲本人接觸ogre的時間比較短,對於不少知識都是隻知其一;不知其二,因此理解起來難免會有一些錯誤,本人也但願本身在對ogre知識有了一個較深的認識後能從新溫故這篇日記,更改本身的誤解或者是對mogre進行補漏。廢話不說了,進入正題。node

  

(1)在寫ogre應用前,應該瞭解ogre的啓動過程,有:app

1 生成一個Root對象框架

2 定義資源:ide

3 設置RenderSystem函數

4 生成RenderWindowui

5 初始化資源組(Resource Group)this

6 創建場景設計

7 Rander循環orm

 

(2)Ogre的三大基礎元素大體包括:對象

場景管理器:場景節點,動態對象。

資源管理器:資源組管理,資源管理

渲染模塊:硬件緩衝區管理,渲染系統,渲染窗口

 

(3)Ogre中的SceneManagers  Entities SceneNodes三個類

SceneManagers管理着全部出如今屏幕上的東西,一個東西出如今在場景中的時候SceneManagers一直跟蹤着其位置。你建立一個Camera時SceneManagers也跟蹤着它,你建立什麼,SceneManagers都跟蹤着……

舉個小例子:

SceneManager sceneMgr;

SceneNode nodeRoot;

 

Entity ent = sceneMgr.CreateEntity("Ninja", "ninja.mesh");

nodeRoot = sceneMgr.CreateSceneNode("node0");

sceneMgr.RootSceneNode.AddChild(nodeRoot);  //important

 

SceneNode node1 = sceneMgr.CreateSceneNode("node1");

nodeRoot.AddChild(node1);

node1.AttachObject(ent);

 

(4)OGRE座標問題:

確切來講是camera的位置,它指向的位置,實體位置,三者之間的關係。

Ogre採用的是右手座標系。

Ogre中有一些定義座標位置和旋轉位置的函數:

調用setPosition(30,20,10),那個結點在就在世界空間的位置(30,20,10)

若是咱們調用translate(30,20,10),結點就會在位置(40,40,40)

 

pitch()函數繞X軸旋轉,yaw()函數繞Y軸旋轉,roll()函數繞Z軸旋轉。咱們可使用Ogre::Degree(degree) 或者Ogre::Radian(radian)其中一個來明確指明咱們想要旋轉的程度

Ogre 3D提供了一個可使編譯器自動轉換角度到弧度的操做的Degree()類

 

Ogre系統中camera和viewport關係:

OGRE抽象出的兩個概念則是模擬觀察者(人)的位置和眼睛。

一個Viewport是對一個Camera所拍攝到的場景的反映。因此說一個Viewport只能綁定一個Camera

一個Camera所拍攝到的場景能夠經過多個Viewport反映到不一樣的區域,因此一個Camera則能夠綁定多個Viewport.

一個Camera同時只能夠拍攝一個場景,因此一個Camera只能夠綁定一個場景

一個場景能夠由多個觀察者去觀察,因此它能夠綁定多個Camera

 

因此ogre系統中多視圖多窗口展示系統場景是能夠實現的,而作出相似的效果的前提是對上述幾個概念靈活掌握,更重要的是靈活運用。

 

從代碼上來反映問題. 如下是OGRE的僞代碼.
Camera * camera1 = scene->CreateCamera("camera1"); (一個camera1 綁定到了scene)
Camera * camera2 = scene->CreateCamera("camera2"); (一個camera2 綁定到了scene)

scene建立了2個Camera對象,即一個場景綁定了多個Camera.
咱們能夠經過設置Camera的位置,角度等來肯定觀察者的位置.如:
camera1->SetPosition(Vector3(0,0,100));
camera1->LookAt(Vector3(0,0,0);

camera2->SetPosition(Vector3(0,0,0));
camera2->LookAt(Vector3(-300,0,-300);

Viewport * vp1 = render_win->addViewport(camera1,0,0,0,1,1);
Viewport * vp11 = render_win->addViewport(camera1,1,0.7,0.7,0.3,0.3);
Viewport * vp2 = render_win->addViewport(camera2,2,0,0,0.3,0.3);

這裏咱們用 vp1和vp11來同時綁定了camera1,不一樣的只是它們的大小和位置不一樣而已.

vp2綁定了camera。3個Viewport在render_win上的顯示的位置是由他們的Z值決定的。因此順序是vp1 vp11 vp2.

通過實踐證實,幾個窗體確實是由camera和viewport形成的。

 

(5)合成器框架Compositor

合成器框架腳本**.compositior

工做原理:合成器框架是在場景已被渲染後來改變場景的顯示,是一種後處理技術。

1.合成器框架將已經渲染的場景渲染到一個texture上去。

2.而後根據須要改變這個texture的內容。

3.爲了渲染texture中的改變後的場景,須要建立一個quad用來cover the monitor。

4. 將texture渲染到quad中去(也便是渲染到屏幕上去)。

 

調用流程:

1. 代碼中加入合成器框架。

2. 合成器腳本中定義被渲染到的紋理和輸出目標quad。

3. 被渲染到的紋理在mayerial文件夾下面的*.material文件。

4. *.material中定義了用到的fragment_program_ref。

合成器框架這部分,本人也作了一些嘗試,這個過程當中會遇這樣那樣的問題,因此仍是隻知其一;不知其二,這裏就貼了一些摘抄的東西。以待後面再解。

 

(6)材料設置

material MyMaterial3

{

    technique

    {

        pass

        {

            texture_unit

            {

                texture terr_rock6.jpg

            }

        }

    }

}

每個material XXX 表明是一個材質單元。其中,每個technique表明一個材質渲染手法,pass是每一個渲染通路模式,  texture_unit則是一個紋理單元。一個材質腳本容許有多個渲染手法技術,一個渲染手法技術中容許有多個渲染通路模式,一個渲染通道容許有多個紋理單元。

tex_address_mode clamp :在紋理單位段中,添加一行代碼告訴Ogre 3D 使用clamp 模式:

wrapping 模式重複的結果。在一塊紋理的最左邊,紋理又以其右邊從新開始重複,紋理下方的重複同理。這種紋理被稱爲無縫紋理

改變紋理模式爲clamp。這個模式使用紋理的邊緣像素來填充全部大於1的紋理座標、在實踐中,這意味着一個圖片的邊緣在模型上獲得了拉伸

改變了紋理模式——此次是mirroring。當用於渲染一塊像石牆那樣的大面積區域時,使用mirror模式就顯得比較簡單而有效了。每次紋理座標值大於1時,紋理就獲得翻轉,而後就如使用wrap模式通常了。

border模式並非如mirro模設計或wrap模式通常建立了紋理的多份拷貝。當紋理座標大於1的時候,這個模式畫任何東西爲邊框顏色——默認的顏色顯然是黑色的,黑色的RGB顏色值爲(0,0,0)。

 

紋理繼承:

material MyMaterial3

{

    technique

    {

        pass

        {

            texture_unit

            {

                texture terr_rock6.jpg

            }

        }

    }

}

 

material MyMaterial4:MyMaterial3

{

    technique

    {

        pass

        {

            texture_unit

            {

                set_texture_alias texture1 Water02.jpg

//texture Water02.jpg

            }

        }

    }

}

(texture alias)爲另外一個可以使用的紋理

 

(7)頂點和片斷着色器。

定義着色器。Ogre 3D 須要有關着色器的五條信息。 】

  ‰ The name of the shader

  ‰ In which language it is written

  ‰ In which source file it is stored

  ‰ How the main function of this shader is called

  ‰ In what profile we want the shader to be compiled

l  着色器的名稱。

l  用哪一種語言寫的。

l  在哪一個文件中儲存。

l  着色器的main函數是如何調用的。

咱們須要編譯着色器的哪些文件。

fragment_program MyFragmentShader1 cg 

{

       source Ogre3DBeginnersGuideShaders.cg   

       entry_point MyFragmentShader1  

       profiles ps_1_1  arbfp1

}

 

vertex_program MyVertexShader1 cg

 {

       source Ogre3DBeginnersGuideShaders.cg 

       entry_point MyVertexShader1  

       profiles vs_1_1 arbvp1                    

       default_params                   

       {       

                       param_named_auto worldViewMatrix worldviewproj_matrix       

       }

}

 

material MyMaterial13

{

    technique

    {

        pass

        {                    

                   vertex_program_ref MyVertexShader1   

                     {

                     }

                     fragment_program_ref MyFragmentShader1   

                     {

                     }

        }

    }

}

接着定義着色器:

//片斷着色器;如今來到頂點着色器。頂點着色器有三個參數 —— 頂點的位置,頂點變換的位置做爲傳出變量,而且做爲咱們用於變換矩陣uniform變量

void MyFragmentShader1(out float4 color: COLOR)

{

    color = float4(0,0,1,0);

}

 

//在着色器內部,使用了矩陣和傳入的位置來計算傳出位置

void MyVertexShader1(float4 position:POSITION, out float4 oPosition:POSITION,uniform float4x4 worldViewMatrix)

{

    oPosition = mul(worldViewMatrix, position);

}

 

(8)幀監聽

  基於幀的運動有一些缺點。基於時間的運動更爲出衆,由於你們須要在全部的電腦上達到一樣的運動效果並且在運動速度上有更高的可控性。在第一步,使用Ogre 3D的一個FrameEvent傳遞給調用的frameStarted() 函數。這個FrameEvent類包含了在短期內自從上一幀被渲染到如今的時間:  (Ogre::Vector3(10,0,0) * evt.timeSinceLastFrame);  這行代碼使用這個公式來計算移動模型每幀移動的大小。使用一個三維向量乘以自上一幀到如今的秒數來計算。在當前的狀況下,使用了向量(10,0,0)。這意味着是想要模型每秒沿X軸移動10個單位。好比說,每秒渲染10幀;而後對於每一幀,evt.timeSinceLastFrame將會是0.1f。在每幀中,咱們用向量(10,0,0)乘以evt.timeSinceLastFrame,那麼結果會是(1,0,0).這一結果將會應用於場景結點移動的每一幀。

  

  

  看mogre快2個禮拜了,對mogre還只是只知其一;不知其二,接下來再接再礪吧。

相關文章
相關標籤/搜索