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

來源:互聯網
上載者:User

渲染隊列(the render queue)
    維護一個像我們這樣的渲染管線最重要的一個方面就是控制那些程式所要求的昂貴的狀態改變(state changes)開銷。一個“狀態改變”就是指示顯卡去切換它正在處理的模型和紋理所要作的所有事情。這些很耗時的狀態改變包括啟用頂點和像素shaders,還有改變D3DX的渲染狀態和紋理採樣器。使用D3DX的效果檔案(effect file)使得這個問題更加困難,因為效果檔案可以包含許多的狀態改變。這些渲染狀態可能在多個效果檔案中被設定很多次,導致同樣的渲染狀態值被一遍又一遍的設定。
 
    我們可以對我們顯卡驅動處理這些冗餘的狀態改變有一點信心,因為這些直接的管理已經超出了我們的控制範圍。然而,我們可以直接控制效果檔案中“技術”(techniques)來確保整個渲染狀態的集合,包括頂點和像素shaders,在一個給定的情境中使用不超過一次。而且,我們也可以擴充我們的管理到模型,頂點緩衝,索引緩衝和模型的啟用。如果我們將這些狀態改變按耗費給予優先值,我們就可以控制他們被送到顯示硬體中去渲染的順序。
    這個可以使用渲染隊列實現,可以在我們程式碼程式庫的cRendderQueue找到。這個隊列有點像一個我們要渲染的物體的執行表(execution list)。我們把這些對象提交到渲染隊列而不是直接渲染到螢幕。一旦所有的物體都被放到這個隊列,我們就可以按照他們的耗費來排序,然後渲染整個情境。這裡的技巧是設計一個表示隊列一項的方法讓它們能夠容易被排序。
    渲染的基本元素是幾何體,材質和渲染方法。這三個東西,帶有一些基本的參數比如轉換矩陣,就是現實一個對象需要的全部。因為很幸運的有了這個,我們已經有了一個代表我們資來源物件cModelResource,cSurfaceMaterial 和cEffectFile的很漸漸的表示。事實上,我們的資源管理員每個對象賦予了一個16位的索引代表他們在一個已經飛配的對象池中的位置。使用這些索引值,我們可以用一個3字(three-word)的值來代表渲染隊列中的元素。
    假定我們強制給這些字一個順序。瞭解到啟用一個效果檔案(包含了頂點和像素shader)是一個非常昂貴的操作,我們把cEffectFile的索引放在我們三字集合的最高位部分。集合體改變是接下來昂貴的,因為他們包含索引緩衝和多個可能的頂點流。記住這個,我們將cModelResource的索引作為第二個字的值,然後近似的把cSurfaceMaterial索引放在最低的字。
    這個構造優先值的過程為我們的渲染隊列建立了一個48位有序的索引。如果我們以這些對象的48位值來排序他們,我們可以確保所有在相同的cEffectFile中的對象在表中都是成組的。在每個組中,所有使用相同cModelResource的幾何體也是成組的,最後,在一個幾何組中所有使用相同cSurfaceMaterial的對象也是成組的。這個有序的列表現在代表了一個渲染情境所需要的狀態改變資源的更高效的數量。
    cRenderEntry 的代碼在這個思想的基礎上用一個20位元組的值來代表渲染隊列的每一個任務。這筆我們48位的例子大得多,然而提供了我們可以用來排序我們渲染操作的更多資訊。cRenderEntry提供了12位元組的值用來排序,另外的8位元組包含一個回調指標(callback pointer)和使用者定義參數。這使得一個調用可以提交一個對象渲染並且提供一個當實際渲染將要發生時將被觸發的回呼函數。cRenderEntry 集中了所有的對象,按優先順序對他們排序,然後通過觸發提供的回呼函數一個接一個的渲染他們。
 
    用來排序cRenderEntry對象的12位元組的值包含了我們例子中相同的基本資料,幾何體,材質和渲染方法。cRenderEntry擴充這個來包含用來標識每個資源特殊用法的額外參數。例如,渲染方法在隊列中不只是用cEffectFile資源的所以字值,還包括用來描述所使用的效果通道(pass)的額外資訊。使用這個資料,我們既是按效果檔案來排序,也是按效果檔案中每個獨立的通道。
    查看cRenderQueue和cRenderEntry的類定義是熟悉我們將要用來處理我們渲染管線的優先隊列的最好辦法。一個值得注意的是那些最後用來執行最終渲染的那些回呼函數的標誌的集合。當渲染隊列處理這個列表,它一直跟蹤那個當前正在使用的資源。當它遇見了表中的一個新資源,回呼函數就被傳遞,同時回呼函數帶有一個標誌來通知使用者去啟用新資源。下面的4.7是cRenderQueue和cRenderEntry類的一些重要的代碼,接下來的4.8展示了我們的一個對象,cModel,使用渲染隊列來提交他自己以渲染,然後調用回呼函數在適合的時間執行實際的模型光柵化。

  

 

 

相關文章

聯繫我們

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