real-time 3d terrain engines using C++ and DX9 翻譯 5

來源:互聯網
上載者:User

資源基類

       所有的引擎資來源物件都是從cResourcePoolItem類中繼承得到的。這個類提供了一個cResourcePoolManager類能夠使用的函數的集合,用以建立,銷毀,從磁碟儲存和載入資源。cResourcePoolItem類對象也為每個資來源物件維護一個核心的資料集合,包括定義資源類型的代碼,一個資源管理員的介面和一個資源的cPoolHandle對象的索引。一個位標誌同樣背維護,記錄著資源當前的狀態。

       cResourcePoolItem類提供一個通用的函數集合來重新找回資源的名字,查詢資源的狀態和重新得到資源資料池的控制代碼。然而,最重要的成員函數是一個用來維護資源本身的純虛函數的集合。從cResourcePoolItem資源基類派生得到的引擎資源提供這些純虛介面函數的實現。這些成員函數創造了可以被管理器對象用來操作資源的介面。清單4.4展示了這些成員函數。

 

使用這個簡單介面函數集合,一個管理器能夠完全的維護一個資來源物件的集合。最值得注意的是,介面函數disableResource和restoreResource允許管理器從可變記憶體中清除或者重建資源。一個例子就是位於顯存中的紋理。如果顯示裝置介面丟失,資源管理員將被通知去禁用所有的依賴資源。當重新獲得顯示裝置,這些子資源能夠很容易的通過調用合適的成員函數來重建。

使用D3DX,我們可以奢侈的使用微軟提供的資源建立管理器。對我們的大多數視頻依賴資源來說,我們將在裝置暫時丟失後對視頻依賴資源利用這一自動重獲管理。以這種方式建立資源只需要簡單的在建立Direct3d資源的時候指定D3DPOOL_MANAGED標誌來支援自動記憶體管理。使用自動記憶體管理我們也得到一個額外的好處,能夠根據需要在記憶體空間有限的情況下確保紋理被從顯存中上傳和刪除。

這個不會應用與動態資源,例如那些我們經常需要重新計算的紋理和幾何體。這些資源最好使用手動管理,因為我們明白什麼時候和他們應該怎麼背新的資料替代。我們的介面使我們能夠有機會使用這兩種方法,這取決我我們怎樣為我們定義的每種資源類型重載虛函數。

 

紋理資源和表面材質

我們最簡單的資源是cTexture對象。這個類實質上是一一種和我們的資源管理計劃相容的方式容納一個IDirect3dTexture9對象的封裝物體。我們在這裡簡單的提到這個類是因為我們將在渲染方法中經常使用到這個類。在我們管理組件裝之外,cTexture同樣包含使用D3DX庫提供的從磁碟中載入紋理檔案的函數。

然而,表面材質是我們自己的創造,需要一點解釋。D3DX作為一個向後相容的偶像,怡然堅持標準的一個材質搭配一個紋理。這一點能夠明顯的從儲存這些對象的一級結構D3DXMATERIAL中看出,這個結構只允許指定唯一一個材質。幾年前,這是合適的,當對於當前的頂級顯卡,這過時得可怕。

作為我們渲染的需要,我們提供一個更新的表面材質類,cSurfaceMaterial,它能容納16個標準的標準的帶有散射光,鏡面光和自發光光照色調紋理。雖然16個紋理看起來會耗盡現今的可以每個過程(pass)使用4~8個紋理的顯卡,但這使得我們有可能使用為多過程渲染同一個表面提供紋理。

例如,我們可能建立一個設計使用兩個過程(pass)共同渲染的表面材質,每個過程(pass)使用4個不同的紋理。這8個紋理在我們的限制之內,並且提供獨立的紋理索引給我們的HLSL著色器使用。我們也可以使用儲存空間來儲存不同版本的表面材質,比如每個紋理的冬天和夏天的版本。著色器可以在初始化是便秘啊選擇合適的集合使用。考慮這些可能,可能16個紋理的限制都太有限了。

cSurfaceMaterials也包含一個位標誌的集合,每個紋理位置一個標誌。這16個位標誌標明某個材質是否被載入到相應的紋理位置。就像我們過一會兒會看到的,這些讓我們能夠使用渲染方法來使表面材質生效。

 

渲染方法資源

cEffectFile類是我們ID3Deffect對象的容器。為了提供我們通常的管理和檔案I/O函數集合,cEffectFile類使用引擎中設定的變數和常量解析編譯後的效果(effect)。正如我們在第二章“Fundamental 3D Object”討論的那樣,Direct3D效果檔案帶有可以通過注釋或者語義而被程式尋找的全域變數。程式可以通過調用ID3Deffect類提供的介面函數設定這些變數的值,該類的基類是ID3DeffectBase類。

這些函數通過接受一個字串或者一個控制代碼來確認這些變數正在被設定,這些函數在DirectX文檔中有詳細描述。通過控制代碼訪問效果(effect)變數更高效,因為它不包括尋找變數名的字串比較開銷。cEffectFile類通過在載入這些效果檔案時預先解析他們來建立一個已知變數類型的控制代碼列表來利用這一特性。表4.1列出了一些cEffectFile類能夠識別的變數類型

 

預解析這些語義得到控制代碼也使我們能夠在內部設定一些位標誌來表示那些變數出現在一個效果(effect)中。例如,我們為可以每個效果檔案中找到的標號的紋理位置(texture slot)設定一個位標誌。通過使用邏輯AND操作將這些紋理標誌位痛一個cSurfaceMaterial資源比較,我們可以迅速的驗證表面材質是包含一個給定的渲染方法所要求的材質數目。

cEffectFile對象的父資源是是cRenderMethod類。我們最終的引擎將在一個複合的,獨特的階段渲染情境。這些階段的兩個例子是光照和凹凸貼圖階段。為了渲染情境,我們允許物體包含多重效果檔案,每個渲染過程一個。cRenderMethod類用於儲存這些cEffectFile對象檔案。cRenderMethod類只是一個到cEffectFile對象檔案連結的集合,渲染過程的每個階段一個。cRenderMethod類也有為每個階段儲存一個獨立的cSurfaceMaterial的標誌,是它能夠描述一個完整的渲染過程。

現在,我們簡單的為每個模型使用唯一一個cEffectFile對象。這能夠是我們的引擎迅速的建立起來並且快速的運行而不會被凹凸貼圖和其他渲染效果阻礙。我們將在本書的第三部分重新回到這個主題,那時我們開始為每個對象使用多個著色器來達到更好的效果。現在,即使我們的模型會包含一個cRenderMethod,這個集合只在“預設”的位置(slot)包含一個cEffectFile對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.