close

一個skybox簡單來說就是,一個巨大的方塊,圍繞著所有場景中的物件。最佳的解釋方法就是展示給你看。
將這行程是加入:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
編譯與執行,skyBoxes有很多有用的屬性,可以供我們來設定。
第一個選項是要不要產生SkyBox,如果希望稍後再取消SkyBox 只要'mSceneMgr->setSkyBox(false, "");' 第二個屬性是skybox要用的材質草稿。
第三個屬性與第四格個屬性對了解 setSkyBox 來說是很重要的。
第三個屬性設定SkyBox 與攝影機的距離,第四個屬性在場景重設之前或之後,完成設定skybox。
現在就來試驗看看,當你調整距離屬性從預設的5000單位調整到非常近的距離會有什麼效果:

mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 10);

沒有變化! 這是因為第四個屬境控制著是否要先繪製skybox的屬性被設成true。要是 SkyBox 被先繪製,之後所更改的任何渲染效果將會被繪製在它之上,因此使得skybox永遠想是在背景。先繪製skybox這種效果並不理想,因為所有的東西都被渲染了。當你將它設定成最後繪製,只有看得見得部分被渲染,這樣可以加速畫面的呈現。
因此,把SkyBox 設定成最後繪製吧:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 5000, false); 

但這跟之前看到的差不多,但現在skybox看不見的部分將不會被渲染。在使用這個技術的時候要十分小心,要是你設設定skyBox 距離太近, 你將有一部分的場景會被切掉。例如:
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 100, false);

如你所見,terrain戳穿SkyBox. 這絕對不是我們想要的. 要是你用SkyBoxes 在你的應用程式中,你必須決定要怎樣運用它們。讓skybox在terrain之後渲染是可以加快速度的, 但要注意幾何的完整性。(除非這就是你要的效果)。一般而言,讓所有東西穿過第二的屬性設成預設是很安全的選擇。
SkyDomes 
SkyDomes 與SkyBoxes非常相似,你將會呼叫 setSkyDome使用它們. 一個巨大的方塊被創見環繞著攝影機與渲染物,但是最大的不同是它的貼圖示球狀投影在skybox到上面。你依然看著方塊,但它看起來就像被貼圖用球狀表面包裝起。主要的缺點是方塊的下方會沒有貼圖,所以你永遠需要一些地形來影藏這個區塊。

這個Ogre 提供的範例,會讓你清楚的看到這個情形。清除 setSkyBox 從 createScene 呼叫的,增加下面的程式碼:

mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8); 

酖你執行,移動攝影機到 terrain 的中心,然後移動攝影機你將會非常接近地形的表面。確定畫面之後,在按R, 切換到可見 mesh 模式。如你所見,我門依然看著方塊,但是它上面彷彿覆蓋著球狀的包裝。

前兩個 setSkyDome 屬性與 setSkyBox 相同 ,你可將 SkyDome 關掉,用 'mSceneMgr->setSkyDome(false, "");'。

第三個屬性非正統的使用 SkyDome。API 建議使用值在2~65之間,降低以達到較好的距離效果,但是較高的數值可以減少雜訊與平滑效果。示著設定第三個屬性在2~65之間,並觀察它的差別。API参考的距離的效果指的是在螢幕截圖時可以清晰的顯示。

第四個屬性是貼圖的次數。你將會需要調整貼圖的大小來改變貼圖次數。確認這個數值是浮點的形別不是整數的型別。你可以將數值調整成 1.234 次, 要是這可以產生你要的效果的話。 
第五與第六個屬性分別是距離與繪製先後,這個前面已經分別提過了。

SkyPlanes 

SkyPlanes 跟 SkyBoxes及SkyDomes差異非常大. 不是在一個方塊渲上染貼貼圖,而是在一個平面上。從createScene中清掉所有的SkyDomes。首先新增一個平面,將它朝下。 setSkyPlane method 的使用不像SkyBox 與 SkyDome 需要距離屬性。那個屬性已經設定在平面的 d 值中:

Ogre::Plane plane;
plane.d = 1000;
plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y; 


現在平面已經定義好了,我可以新增 SkyPlane。 注意第四個屬性設定SkyPlane的大小 (在範例中是 1500x1500 單位) 第五個屬性貼圖次數:
mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 1500, 75); 

編譯與執行程式。新增SkyPlane有兩個問題。
第一個,貼圖次數太低,沒有完整鋪好。這可以很簡單解決,只要調高貼圖次數與調整貼圖材質就可以了。 然而,這個技術的主要的問題是看你看著水平線時會發現盡頭。不論你的貼圖的材質好壞,這個現象不令人滿意。SkyPlane大部分用在當你有一座高牆的時候 (或山脈) 圍繞著視角。使用 SkyPlane 在考慮降低圖片的密集度的時候使用。

幸運的是,這並不是所有我們可以使用 SkyPlane屬性. 第六個屬性是先繪製,這在之前已經提過了。
第七個屬性允許你彎曲 SkyPlane, 如此一來我們不必再用平面,可以用曲面來當作表面。我們需要設定x,y的切割數來建立 SkyPlane (初始的 SkyPlane 是一個巨大的正方形,但要是我們彎曲它,我們需要設定一些分割線。)第八個與第九個屬性是x與y的切割數:

mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 1500, 50, true, 1.5f, 150, 150); 

編譯與執行,現在 SkyPlane 看起來比較好,經過再次鋪平精會產生相同的效果。你可以用cloud material 來取代:
mSceneMgr->setSkyPlane(true, plane, "Examples/CloudySky", 1500, 40, true, 1.5f, 150, 150); 

編譯與執行。使用 clouds 來做這種貼圖會比用SkyDome略差一些,特別是靠近地形的邊緣,會看到水平線的外面。
可以清掉 SkyPlane 呼叫 'mSceneMgr->setSkyPlane(false, Ogre::Plane(), "");'

arrow
arrow
    全站熱搜

    hoshili770205 發表在 痞客邦 留言(0) 人氣()