(一)D3D9渲染原理

2021-08-20 17:22:45 字數 2898 閱讀 7188

su***ce和texture。使用su***ce相對來說比使用texture要簡單一些,但是不如使用texture靈活。

抽象概念

direct3d的抽象概念包括:devices(裝置),swap chains(交換鏈)和resources(資源)。

device(裝置)用於渲染3d場景。例如單色裝置就會渲染黑白,而彩色裝置則會渲染彩色。device目前我自己了解的有以下2類:

hal(hardware abstraction layer):支援硬體加速的裝置。在所有裝置中執行速度是最快的,也是最常用的。

reference:模擬一些硬體還不支援的新功能。換言之,就是利用軟體,在cpu對硬體渲染裝置的乙個模擬。

每乙個device至少要有乙個swap chain(交換鏈)。乙個swap chain由乙個或多個back buffer su***ces(後台緩衝表面)組成。渲染在back buffer中完成。此外,device包含了一系列的resources(資源),用於定義渲染時候的資料。每個resources有4個屬性:

type:描述resource的型別。例如su***ce, volume, texture, cube texture, volume texture, su***ce texture, index buffer 或者vertex buffer。

usage:描述resource如何被使用。例如指定resource是以唯讀方式呼叫還是以可讀寫的方式呼叫。

format:資料的格式。比如乙個二維表面的畫素格式。例如,d3dfmt_r8g8b8的format表明了資料格式是24 bits顏色深度的rgb資料。

pool:描述resource如何被管理和儲存。預設的情況下resource會被儲存在裝置的記憶體(例如顯示卡的視訊記憶體)中。也可以指定resource儲存在系統記憶體中。

渲染流水線(rendering pipeline)

direct3d api定義了一組vertices(頂點), textures(紋理), buffers(緩衝區)轉換到螢幕上的流程。這樣的流程稱為rendering pipeline(渲染流水線),它的各階段包括:

input assembler(輸入組裝):從應用程式裡讀取vertex資料,將其裝進流水線。

vertex shader(頂點著色器):對每個頂點屬性進行著色。每次處理乙個頂點,比如變換、貼圖、光照等。注意這個地方可能需要自己程式設計。

geometry shader(幾何著色器): shader model 4.0引進了幾何著色器,處理點、線、面的幾何座標變換。此處我自己還不是很了解。

ps:上述處理完後的資料可以理解為以下。即包含頂點資訊,但不包含顏色資訊。

stream output(流輸出):將vertex shader和geometry shader處理完成的資料輸出給使用者。

rasterizer(光柵化): 把算完的頂點轉成畫素,再將畫素(pixels)輸出給pixel shader。這裡也可執行其他工作,比如畫素資料的切割,插值等。

ps:光柵化的過程可以理解為下圖。即把頂點轉換成畫素。

pixel shader(畫素著色器):對每個畫素進行著色。注意這個地方可能需要自己程式設計。

output merger(輸出混合):整合各種不同的資料,輸出最後結果。

1.三角形

在direct3d中經常會出現「三角形」這個概念。這是因為在3d圖形渲染中,所有的物體都是由三角形構成的。因為乙個三角形可以表示乙個平面,而3d物體就是由乙個或多個平面構成的。比如下圖表示了乙個非常複雜的3d地形,它們也不過是由許許多多三角形表示的。

因此我們只要指定乙個或多個三角形,就可以表示任意3d物體。

2.後台緩衝表面,前台表面,交換鏈,離屏表面

後台緩衝表面和前台表面的概念總是同時出現的。簡單解釋一下它們的作用。當我們進行複雜的繪圖操作時,畫面可能有明顯的閃爍。這是由於繪製的東西沒有同時出現在螢幕上而導致的。「前台表面」+「後台緩衝表面」的技術可以解決這個問題。前台表面即我們看到的螢幕,後台緩衝表面則在記憶體當中,對我們來說是不可見的。每次的所有繪圖操作不是在螢幕上直接繪製,而是在後台緩衝表面中進行,當繪製完成後,需要的時候再把繪製的最終結果顯示到螢幕上。這樣就解決了上述的問題。

實際上,上述技術還涉及到乙個「交換鏈」(swap chain)的概念。所謂的「鏈」,指的是一系列的表面組成的乙個合集。這些表面中有乙個是前台表面(顯示在螢幕上),剩下的都是後台緩衝表面。其實,簡單的交換鏈不需要很多表面,只要兩個就可以了(雖然感覺不像「鏈」)。乙個後台緩衝表面,乙個前台表面。所謂的「交換」,即是在需要呈現後台緩衝表面中的內容的時候,交換這兩個表面的「地位」。即前台表面變成後台緩衝表面,後台緩衝表面變成前台表面。如此一來,後台緩衝表面的內容就呈現在螢幕上了。原先的前台表面,則扮演起了新的後台緩衝表面的角色,準備進行新的繪圖操作。當下一次需要顯示畫面的時候,這兩個表面再次交換,如此迴圈往復,永不停止。

此外,還有乙個離屏表面。離屏表面是永遠看不到的表面(所謂「離屏」),它通常被用來存放位圖,並對其中的資料做一些處理。本文介紹的例子中就用到了乙個離屏表面。通常的做法是把離屏表面上的點陣圖複製到後台緩衝表面,後台緩衝表面再顯示到前台表面。

D3D9學習筆記之渲染狀態關鍵字

d3drs fillmode繪製模式設定,可設定為點,線與面模式3種分別是 d3dfill point d3dfill wireframe,d3dfill solid d3drs cullmode消隱模式,按照三角形單元的頂點繞序進行背面消隱,可設定為 禁用背面消隱d3dcull none,對順時針...

D3D9學習筆記之顏色

學習目標 顏色的表示 在 direct3d 中,顏色用 rgb 三元組來表示。將顏色分解為紅色 red 綠色 green 藍色 blue 這三個分量的加性混合決定了最終的顏色。我們可用該三個分量的不同組合來表示上百萬種顏色。rgb資料可用兩種不同的結構來儲存 第一種是結構是 d3dcolor,它實際...

D3D9學習筆記之光照

學習目標 為了場景的真實感,可為場景增加光照。光照有助於描述實體形狀和立體感。使用光照時,無需自行指定頂點的顏色值 direct3d 會將頂點送入光照計算引擎,依據光源型別,材質以及物體表面相對於光源的朝向,計算出每個頂點的顏色值。基於某種光照模型計算出各頂點的顏色,會使繪製結果更逼真。在 dire...