Direct3D固定渲染流水線分析與總結

2021-06-21 00:39:36 字數 2730 閱讀 5325

d3d渲染管線的意義是什麼呢?說白了就是將3d影象轉換成2d影象到螢幕的過程。

那如何操作呢?這便是咱接下來需要解決的!

此篇理論東西多點,隨著下一章節的學習會好點,所以,大傢伙就跟我一塊重溫學習下吧。

在基於d3d的圖元繪製均是以三角形網格的搭建為基礎的,這個過程稱之為建模。那如何在程式中實現乙個三角形的繪製呢?你要記得乙個關鍵點就是順時針和逆時針的順序,我個人比較喜歡順時針。下邊會講解順時針和逆時針的區別!本章的重點是講述d3d的固定渲染管線,所以涉及的其他知識點,會在接下來的學習中,補充!

一、頂點格式 建立乙個頂點,並不是單純數學意義上的只包含位置就完事了,d3d為我 們擴充套件了很多,咱舉個例子,每個頂點,都有位置postion、法線noraml、紋 理texture1、顏色colour等。那擁有這麼多的附加屬性,我們怎麼弄呢?還記 得我們在c++中學過的結構體嗎,對,就是它,用它來實現定義。舉個例子:

struct vertex

這裡需要乙個注意的地方,就是當你再定義靈活頂點格式(fvf)的時候,順 序應與你定義的結構體的順序一致。例如:

#define fvf_vertex(d3dfvf_xyz | d3dfvf_norml | d3dfvf_tex1 | d3dfvf_diffuse)

二、三角形的組織 這裡先不說了,到下一章實戰操作的時候再整!記得順序、普通組織、 索引組織這幾個概念。

三、簡要介紹下攝像機 攝像機的作用就是確定哪些可見的3d物體轉換成2d圖形。 可視體:由遠近裁剪面組成的平截台體。只顯示在可視體內部的圖形,其他的 一律剔除,這個過程叫做裁剪。 投影視窗:是這個可視體內的3d幾何圖形投影生成的3d物體的2d影象的2d區域。 詳細的說明會專門拿出一章來學習d3d的攝像機。

四、固定渲染管線《本章的核心,前面僅需了解即可》 在我們的圖形幾何學上有了3d場景及攝像機,最後我們還需要將它們轉換成2d 圖形來顯示在螢幕上。這就是固定渲染管線所作的工作。 實際上d3d的渲染管線大部分工作都是在做圖形變換。d3提供了乙個簡便的函式 g_pdevice->settransform(變換型別,變換矩陣)。 下邊我們一起回顧或者學習一下d3d的渲染流水線的理論細節:

1、本地空間 說白了就是建模空間(美工建模,或者你在本地組織三角形的組織方式)

2、世界空間 通過平移旋轉縮放將那些本地空間的物體轉換成世界空間內的物體,以 實現場景的組織。d3d提供了乙個位置變換的函式d3dxmaterxtranslation; 旋轉函式d3dxmaterxroationx/y/z/axis;縮放函式d3dxmaterxscalling。具體 請你參閱dxapi。

3、檢視空間(即攝像機空間) 世界空間中的幾何圖和攝像機的位置是相對於世界座標而定義的。但是有 乙個缺陷是如果攝像機的位置在世界空間中的位置不是確定的或者死板的,那 通過該攝像機去觀察物體那是非常難於控制和低效的。在這種尷尬局面下,誕 生了檢視空間這個概念!我們這樣操作攝像機,首先將攝像機移至世界空間的 原點,然後旋轉攝像機,讓它的正方向與世界空間的z方向一致。這樣當你再移 動或者旋轉攝像機的時候,世界空間中的幾何圖就會隨著攝像機的變化而做相 同的變化。使其變得順其自然,而不是被動的啦! d3d同樣為我們提供了乙個簡便的函式d3dxmatrilookatlh。

4、背面揀選 d3d通過背面揀選方式剔除(即刪除多餘的處理過程)無用的背面多邊形,來 提高程式的執行效率。 d3d預設的頂點是以順時針組織的多邊形為該多邊形的正面。 d3d同樣給我們提供了乙個函式來做這項工作: g_device->setrendstate(d3drs_cullmode,value)。預設的是d3dcull_ccw。

5、光照 光照的定義是在世界空間中定義的,並不是在檢視空間定義的。但是檢視空間 將這些點弄的非常真實。

6、裁剪 超出憑藉台體的部分幾何圖將被無情裁剪,藉此提高程式執行的效率跟效能。

7、投影 投影的作用就是將3d場景轉換成2d影象,然後轉到投影視窗上去。 這種從n維到n-1維的過程就叫投影。遊戲開發中用到的投影是透視投影。 因為透視投影可以使遠離攝像機的圖形在螢幕上顯示的時候也變小,這使得 我們的效果更加逼真的轉換成2d影象。 d3d同樣也給我們乙個簡便的投影變換矩陣:d3dxmaterxperspectivefovlh。

8、視口變換 視口變換就是將投影視窗變換為螢幕上乙個矩形區域的可靠變換,這個矩形區域 就是所謂的視口。 d3d中有乙個結構體幫助我們設定視口的相關屬性d3dviewport9結構;並且d3d還 給我們提供了另外乙個重要的函式g_pdevice->setviewport(d3dviewport結構的乙個 變數位址)。 對於視口變換的矩陣的相關重要知識點下節進行重要分析。

9、光珊化處理 經過視口變換這些個影象就到螢幕上去了。光柵化所處理的是計算需要顯示的每個 三角形中每個點的畫素值。它總是應該通過硬體來進行處理,因為它太過於繁瑣了如果 微軟自己編碼處理的話。 在計算完了畫素值之後呢,它就將這個成形的2d影象凸現出來啦!

說了這麼多,我感覺最後需要總結一下子,你覺得呢? 本章重點闡述了d3d的固定渲染流水線。涉及9小點,那你如何記憶呢? 還是之前說的d3d初始化那個記憶方法: 分為3個流程:

設計 --- 生產 --- 顯示

設計:本地 ---> 世界 -->檢視空間(攝像機空間) --> 揀選 -->光照 ---> 裁剪(超出平截台體的部分)

生產:按照以上設計的規格進入生產流程 --> 投影(將設計中的3d物體轉換成現實的2d影象,並轉到投影上去) --->視口變換(將2d影象對映到螢幕的某個區域內,給他提供可供顯示的空間)

顯示: 光柵化處理

批註: 光柵化做了什麼什麼事情: 光柵化就是把向量的圖形畫素化,比如說3個頂點組成的乙個三角形把它轉化為螢幕上的畫素的過程。 簡單的說,就是把要顯示的東西,顯示在顯示器上過程(給影象加顏色實際上)。

渲染流水線

應用階段 cpu準備資料,skinmeshrender,meshfilter,meshrender 頂點資料,三角形資料,法線資料,切線資料,渲染設定指令,紋理資料,uv資料 由cpu傳送給gpu,即一次drawcall 幾何階段 頂點變換,計算頂點顏色 如逐頂點光照 齊次裁剪空間,透視除法,歸一化...

UnityShader 渲染流水線

渲染具體流程 幾何階段 光柵化階段 渲染流水線的最終目的在於生成或者說是渲染一張紋理,即我們在螢幕上看到的所有效果。它的輸入是乙個虛擬攝像機 一些光源 一些shader以及紋理等。渲染流程分為3個階段 應用階段 幾何階段 光柵化階段。圖中,綠色表示該階段是完全可程式設計控制的,黃色表示可以配置但不是...

Direct3D多視口渲染

多視口渲染主要是改變了視口矩陣,一般我們的shader程式沒有直接處理這個視口矩陣,注意多視口渲染的順序 void render 上面任何乙個步驟出錯都會帶來以外的結果。1.除最後乙個視口外全螢幕閃爍,這也是為什麼要還原原視口的原因,如果我們不還原,那麼下一次clear 的是上次渲染的最後乙個視口,...