關於遊戲中的材質系統

來源:互聯網
上載者:User

材質,這個詞有各行各業都有自己的解釋。

美工把物體貼圖和物體顏色,高光等統稱為材質。D3D和OPENGL這樣的圖形介面則把物體表面貼圖單獨叫做紋理,而把漫反射,高光等叫做材質。

 

而在遊戲引擎或圖形引擎中提到的材質,則與此不同。 引擎中提到的材質不僅上面的的內容。 引擎中所謂的材質,是指物體在渲染時一系列的狀態控制。 如,ALPHA混合開關以及ALPHA混合因子、紋理過慮方式,紋理通道狀態、紋理矩陣、裁剪模式等,在D3D中,就是SetRenderState,SetTextureStageState,SetSamplerStateState等所控制的。在OPENGL中,則大多數由glEnable所控制。

 

我們所提到的材質系統,則是以此為基礎展開的。 上面提到的這些因子,組成了我們的材質。 也是我們在渲染一個物體的時候,提交到裝置的狀態控制值。 一個物體的一次渲染,我們稱作一個PASS。於是我們順其自然地將這個渲染時的材質控制的最小單位命名為Pass,則:

 

struct TextureState

{

    void* Texture;

    int ColorOp;

    int ColorAgr1;

    int ColorAgr2;

    int AlphaOp;

    int AlphaAgr1;

    int AlphaAgr2;

.....//更多內容

};

 

class CPass

{

   CColor mAmbient;

   CColor mDiffuse;

   ....更多內容

 

    bool mAlphaEnable;

    int mScrBlend;

    int mDstBlend;

    int mCullMode;

   TextureState[4] mTextureStates;

  ...更多內容

};

 

當我們渲染一個物體的時候,只需要將這個類裡面的狀態應用到裝置,即可完成對物體的繪製。

 

材質系統的基本內容就是這些,這也是最容易做到的事情。

但是,我們都知道,像D3D或OPENGL這樣的圖形介面每設定一次GPU狀態的時候,都會有一定的開銷(通過查看相關文檔可以看到某些函數的具體開銷值)。而為了保證我們的渲染流暢,我們不得不減少這樣的開銷。

 

很自然地,我們會想到,盡量減少切換。而如何減少切換呢。我們可以記錄下自己的硬體狀態,在設定下一個的時候,先判斷當前硬體狀態是否相同,如果相同。則不用再設定。 雖然某些圖形介面在其層底做了類似的功能。但我們外部判斷一下,也未嘗不可。從D3D上來講,外部判斷比讓其內部判斷效率更佳。需要注意的是,由於我們在自己的程式裡做了相同判斷。因此,當有另一個程式也修改裝置狀態的時候,就會產生意想不到的效果。所以,我們應該適當的查詢一下裝置狀態,並更新自己的狀態記錄表。至於這個查詢間隔,就要根據自己的實際情況來測試了。

 

 

通過選項組的方法來提升的效率是很不明顯的,因此,我們需要對材質進行排序,至於怎麼排序,這演算法上的問題,在此先不作過多解釋。 總之,我們將相似的材質排在一起。由於材質很相似,繪完一個再繪下一個的時候,減少了切換,從而大大提升了效率。

 

既然已經是涉及到裝置了,我們總得考慮一下裝置問題。 如果裝置不支援我們當前給定的材質狀態,怎麼辦? 返回FALSE不渲染。還是讓程式DOWN掉?  對於一些重要的效能,裝置不支援讓程式DOWN掉是最好的做法,但是,對於像紋理混合通道不足的情況,讓其DOWN掉就顯得划不來了。畢竟我們設計的遊戲程式是想讓更多的玩家能玩不是? 這樣就會涉及到PASS的拆分問題。

 

對於PASS的拆分,OGRE已經做得很好了。根據使用者的裝置效能,如果不滿足,就一直拆分,拆到使用者滿足為止,最後讓一個物體渲染多次,來實現多個紋理通道混合的效果。 而多PASS則是在渲染的時候不得不考慮的地方,畢竟有些物殊效果非得用多PASS不可。

 

對於多PASS的設計,我們可以參考OGRE的材質方法或是D3DX的效果架構。我們把完成一個最終效果的方案稱作一個渲染技術 Technique ,一個技術可由多個Pass來完成。

 

class Technique

{

...更多內容

 vector<CPass*> mPasses;

};

 

這樣就滿足了我們的需求。  對於同一種效果,我們可以提供多種Technique供程式選擇。 而這個選擇的條件則可以是根據硬體效能,或是玩家手動選擇的配置來實現。

最後結構如下:

class CMaterial

{

public:

...更多內容

vector<CTechnique*> mRenderTechs

};

 

 

 

亂七八糟地說了一通,希望沒暈死人!!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.