天天看點

DIRECT3D基礎知識 ---- 渲染與紋理 及位圖,頂點緩存釋義

什麼是渲染:

渲染—采集下的數字影片進行了剪接、加效果、加字幕、音樂等操作,當生成影片時需要将後加入的素材融合到影片中并壓縮成為影片最終格式,這個過程就是渲染。

什麼是紋理?

早期的計算機生成的3-D圖象,它們的表面看起來就象是一個發亮的塑膠表面。它們總是缺少一些能使物體看起來更加真實的東西,如表面的磨損、裂紋、人手的印記或是一些污點等等。近幾年來,紋理的使用使得計算機三維圖象具有了更好的真實感。

一個紋理實際上就是一個位圖。從這個意義上來講,當紋理一詞被用于計算機圖形學時,它就有了一個明确的定義。從語義學角度來講,紋理一詞既是指一個物體上顔色的模式,又是指物體表面是粗糙的還是光滑的。Direct3D的紋理不會使物體表面真的變得“崎岖不平”,而隻是使它的表面看起來是“崎岖不平”的。

由于Direct3D的紋理就是簡單的位圖,是以任何紋理都可以被用在Direct3D圖元上。例如,我們可以建立一些具有木頭和谷物圖案的對象;也可以将一些青草、泥土和岩石用于一些三維圖元,并将它們堆成一座小山,這樣就有了一個山坡的背景;或者搞一些路标、懸崖等等。

另外,Direct3D還支援一些進階的紋理技術,如紋理融合(透明或不透明)、光線映射(light mapping)等。

如果程式建立了一個HAL裝置、MMX裝置或RGB裝置,它就可以使用8-、16-、24-或32-bit紋理。使用單色裝置的程式可以使用8-bit紋理。

位圖是一個二維的位數組,此數組的每一個元素與圖像的像素一一對應。現實世界的圖像被捕獲以後,圖像被分割成網格,并以像素作為取樣機關。位圖中的每個像素值指明了一個機關網格内圖像的平均顔色。

位圖代表了Windows程式中存儲圖像資訊的兩種方法之一,另一種形式是元檔案。

位圖也有兩種:GDI位圖對象和裝置無關的位圖(DIB: device-independent bitmap)。

位圖基礎

位圖常用來表示來自真實世界的複雜圖像,元檔案更适合于描述由人或者機器生成的圖像。它們都能存于記憶體或作為檔案存于磁盤上,且能通過剪貼闆在Windows應用程式間傳輸。

位圖和元檔案的差別在于光栅圖像和矢量圖像間的差别。光栅圖像用離散的像素來處理輸出裝置;矢量圖像用笛卡爾坐标系統來處理輸出裝置,可在其中繪制線和填充對象。

位圖的缺點:1、容易受裝置依賴性的影響。2、位圖常暗示了特定的顯示分辨率和圖像縱橫比,在縮放後容易出現失真。3、存儲空間大。

但位圖具有處理速度快的優點。

位圖可以手工建立,也可計算機代碼生成,還可由硬體裝置把現實世界輸入到計算機,如數位相機,它們通常是使用接觸到光就釋放電荷的電荷耦合裝置(CCD: charge-coupled device)将光的強度轉換為電荷,再用模數轉換裝置(ADC: Analog-to-digital)轉換為數字再排列為位圖。

位圖尺寸

位圖呈矩形,具有空間尺寸,以像素為機關度量位圖的高度和寬度。以位于圖像左上角為位圖原點,從0開始計數。

位圖的空間尺寸也指定了其分辨率,但此詞具有争議,分辨率也指機關長度内的像素數。

位圖是矩形的,但記憶體是線性的。大多數位圖按行存儲在記憶體中,且從頂行像素開始從左到右直到底行結束。

位圖還有顔色度量機關:指每個像素所需要的位數,也稱顔色深度(color depth)、位數(bit-count)、或位/每像素(bpp: bits per pixel)。每個像素用1位來描述的位圖稱為二級(bilevel)、二色(bicolor)或單色(monochrome)位圖。每個像素也可用多位來描述,可以表示的顔色數等于2的i次方(i為位數)。

如何将顔色位的組合與人們所熟識的顔色相對應是處理位圖時經常出現的問題。

頂點緩存:

在遊戲中,物體模型是用多邊形網格來描述的,一般的是三角形,頂點緩存就是來存儲用來描述物體模型的所有多面形的頂點的資訊,這些資訊有頂點的三維坐标,頂點顔色,頂點法向量,紋理坐标等。

使用頂點緩存分為四步

1 設計頂點緩存

就是用來說明你的頂點中有哪些資訊

比如: 

struct MYVERTEX

{

float x,y,z;//頂點的三維坐标 x,y,z

DWORD color;//頂點的顔色值

}

然後用一個宏來描述頂點所包含的資訊,以便随後設定到環境中

#deifne D3DFVF_MYVERTEX  (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

2 建立頂點緩存

函數 CreateVertexBuffer

比如:

LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer = NULL;

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),

0, D3DFVF_CUSTOMVERTEX,

D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) )

{

return E_FAIL;

}

3 通路頂點緩存

函數 通路之前需要先把頂點緩存的記憶體鎖住,然後讀寫資料,然後解鎖,直接貼出代碼

//頂點資料,

CUSTOMVERTEX vertices[] =

{

{ 300.0f, 100.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), },

{ 500.0f, 100.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), }, 

{ 300.0f, 300.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), },

};

//填充頂點緩沖區

VOID* pVertices;

if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )

return E_FAIL;

memcpy( pVertices, vertices, sizeof(vertices) );

g_pVertexBuffer->Unlock();

4 繪制圖形

這裡就是繪制三角形

這裡要分三小步

(1)設定資料源 

函數 SetStreamSource

(2)設定定點格式

函數 SetFVF

(3)繪制圖形

函數 DrawPrimitive

貼代碼

g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);//設定渲染狀态

g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );

g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );

--------------------- 

轉載位址:

https://zhidao.baidu.com/question/15585106.html

http://blog.sina.com.cn/s/blog_69f141290100oa34.html

https://blog.csdn.net/jddchina/article/details/40022725 

繼續閱讀