深度緩衝區

2021-09-12 19:15:02 字數 3508 閱讀 6412

深度緩衝區是direct3d用來儲存繪製到螢幕上每乙個畫素點的深度資訊的—塊記憶體緩衝區。

它為每個畫素儲存乙個深度值(z值),這個深度值是從攝像機到對應該畫素點的頂點之間的距離。

深度緩衝區的大小和顏色緩衝區(frame buffer)的大小一致。

例如:如果要繪製乙個640×480解析度的,則在深度緩衝區中就將儲存640×480個深度資訊。

深度緩衝區的格式決定著深度測試的精確性,乙個24位的深度緩衝區比16位的深度緩衝區更為精確。

通常應用程式在24位的深度緩衝區下就能得到比較精確的結果。direct3d最高可以支援32位的深度緩衝區。

並不是所有的硬體都能支援32位的深度緩衝區。在確定深度緩衝區的格式之前,需要檢查硬體支援的深度緩衝區格式。

深度緩衝區格式深度緩衝區格式描述

d3dfmt_d32

32位的深度緩衝區

d3dfmt_d15s1

15位的深度緩衝區和

1位的模版緩衝區

d3dfmt_d24s8

32位的深度緩衝區,

24位儲存深度值,

8位儲存模板值

d3dfmt_d24x8

32位的深度緩衝區,

24位儲存深度值,

8位保留位

d3dfmt_d24x4s4

32位的深度緩衝區,

24位儲存深度值,

4位儲存模板值,

4位保留位

d3dfmt_d16

16位的深度緩衝區

並不是所有的硬體都能支援32位的深度緩衝區。在確定深度緩衝區的格式之前,需要檢查硬體支援的深度緩衝區格式。

d3ddisplaymode d3ddm;

if(failed(m_pd3d->getadapterdisplaymode(d3dadapter_default,&d3ddm)))//通過引擎指標獲得顯示卡的顯示模式的結構體都d3ddm並通過檢測它的格式支援幾位

return false;

//選擇深度緩衝區格式

if(m_pd3d->checkdeviceformat(d3dadapter_default, d3ddevtype_hal,d3ddm.format, d3dusage_depthstencil,d3drtype_su***ce, d3dfmt_d32) == d3d_ok)

//選擇32位深度緩衝區

else if(m_pd3d->checkdeviceformat(d3dadapter_default, d3ddevtype_hal,

d3ddm.format, d3dusage_depthstencil, d3drtype_su***ce, d3dfmt_d24x8) == d3d_ok)

else if(m_pd3d->checkdeviceformat(d3dadapter_default, d3ddevtype_hal,

d3ddm.format, d3dusage_depthstencil, d3drtype_su***ce, d3dfmt_d16) == d3d_ok)

else

direct3d通過比較當前繪製的畫素點的深度和對應深度緩衝區的點的深度值來決定是否繪製當前畫素。如果深度測試為true,則繪製當前畫素,並用當前畫素點深度值更新深度緩衝區,反之則不予繪製。

深度緩衝能確定哪個物件在前,哪乙個物件在後,從而正確的渲染物件。

深度測試的演算法有很多種,並不是只能設定深度值小的點通過深度測試,direct3d中可以由程式設計師選擇需要的深度測試演算法。呼叫idirect3ddevice9::setrenderstate()函式設定深度測試函式,將第乙個引數設為d3drs_zfunc,第二個引數設為想要設定的深度測試演算法,它屬於d3dcmpfunc列舉型別。

typedef enum _d3dcmpfunc  d3dcmpfunc;
通常情況下,深度測試演算法總是設定為d3dcmp_less,表示當測試點深度值小於深度緩衝中的相應值時返回true,即距離攝像機更近的點通過深度測試並繪製相應的畫素點

// g_pdevice為有效的direct3d裝置

g_pdevice->setrenderstate( d3drs_zfunc, d3dcmp_less );

為了正確地繪製場景中的物體需要使用深度緩衝。一般按照一下步驟就可以實現:

1)建立深度緩衝區

若要在direct3d圖形程式中應用深度測試,首先必須在建立direct3d渲染裝置時建立深度緩衝區,並設定深度緩衝區的格式。

// 表示由direct3d建立並管理乙個深度緩衝區

d3***.enableautodepthstencil = true;

//深度緩衝區的每乙個畫素由16位的整數值表示

d3***.autodepthstencilformat = d3dfmt_d16;

//在d3***是裝置引數結構體的例項 ,可用檢查硬體支援的緩衝區格式代替

2)啟用深度測試

direct3d渲染裝置建立好後,呼叫direct3d中渲染狀態設定的函式,setrenderstate()來啟用深度測試。

// g_pd3ddevice為有效的d3d裝置

g_pd3ddevice->setrenderstate(d3drs_zenable, true);

3)設定深度測試函式

呼叫idirect3ddevice9::setrenderstate()設定深度測試函式,將第乙個引數設為d3drs_zfunc,第二個引數設為想要設定的深度測試演算法。

// g_pd3ddevice為有效的direct3d裝置

g_pd3ddevice ->setrenderstate( d3drs_zfunc, d3dcmp_less );

4)設定深度緩衝區更新

設定了深度測試函式後,還需要設定深度測試成功時對深度緩衝區如何操作,是保持原來的深度值,還是用當前畫素的深度值更新對應的數值。

呼叫函式setrenderstate()設定深度緩衝區的更新,將第乙個引數設為d3drs_zwriteenable,第二個引數設為true,表示允許應用程式在繪製畫素時更新深度緩衝區。

// 設定深度緩衝區更新

g_pd3ddevice->setrenderstate(d3drs_zwriteenable, true);

5)清空深度緩衝區

因為場景內的物體是可以動得,另外攝像機也可以隨便移動,所以物體的深度值是在不停的更新的。所以在繪製圖形之前,把深度緩衝區全部清空一次,以便於重新更新圖形的深度。

g_pd3ddevice->clear(0,0,d3dclear_target|d3dclear_zbuffer,0xffffffff,1.0f,0.0f)

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...

使用者程序緩衝區和核心緩衝區

常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...

php 緩衝區,PHP的輸出緩衝區

1 什麼是緩衝區?緩衝區的作用是把輸入或者輸出的內容先放進記憶體,而不顯示或者讀取,最本質的作用就是協調高速cpu和相對緩慢的io裝置 磁碟等 的運作。2 php在執行的時候,在什麼地方有用到緩衝區?當執行php的時候,如果碰到了echo print r之類的會輸出資料的 php就會將要輸出的資料放...