D3D深度測試和Alpha混合

2021-08-22 14:07:33 字數 2568 閱讀 6950

1.深度測試

a)深度緩衝區:螢幕上每個畫素點的深度資訊的一塊記憶體緩衝區.d3d通過比較當前繪製的畫素點的深度和對應深度緩衝區的點的深度值來決定是否繪製當前畫素.

b)d3dpresent_parameters. autodepthstencilformat =

d3dfmt_d16

表示深度值由16位二進位制表示

開啟深度測試:pdevice->setrenderstate(

d3drs_zenable, true );

深度測試函式:d3drs_zfunc:

d3dcmp_never

總是返回

false

d3dcmp_less (常用)

小於深度緩衝區的相應值時返回

true

d3dcmp_equal 等於

d3dcmp_lessequal

小於等於

d3dcmp_greater 大於

d3dcmp_notequal

不等於d3dcmp_greaterequal

大於等於

d3dcmp_always

總是返回

true

更新緩衝區:保持深度緩衝區不變還是用當前畫素的深度值更新

pdevice->setrenderstate(

d3drs_zwriteenable, true );

2.alpha混合

a)原理:color = (rgb

src * k

src) op (rgb

dst * k

dst)

最常用的方法:color = (rgb

src * alpha

src) + (rgb

dst * (1 – alpha

src)

b)應用

啟用:pdevice->setrenderstate( d3drs_alphablendenable, true );

blend mode factor

description

d3dblend_zero

(0, 0, 0, 0)

d3dblend_one

(1, 1, 1, 1)

d3dblend_srccolor

(rs, gs, bs, as)

d3dblend_invsrccolor

(1-rs, 1-gs, 1-bs, 1-as)

d3dblend_srcalpha

(as, as, as, as)

d3dblend_invsrcalpha

(1-as, 1-as, 1-as, 1-as)

d3dblend_destalpha

(ad, ad, ad, ad)

d3dblend_invdestalpha

(1-ad, 1-ad, 1-ad, 1-ad)

d3dblend_destcolor

(rd, gd, bd, ad)

d3dblend_invdestcolor

(1-rd, 1-gd, 1-bd, 1-ad)

d3dblend_srcalphasat

(f, f, f, 1); f = min(as, 1-ad)

alpha混合方法

d3dblendop_add

源計算結果與顏色緩衝區計算結果相加

d3dblendop_subtract

源計算結果減去顏色緩衝區計算結果

d3dblendop_revsubtract

顏色緩衝區計算結果減去源計算結果

d3dblendop_min

min(源計算結果, 顏色緩衝區計算結果)

d3dblendop_max

max(源計算結果, 顏色緩衝區計算結果)

color = (rgb

src * alpha

src) + (rgb

dst * (1 – alpha

src) )的設定示例:

pdevice->setrenderstate(

d3drs_srcblend, d3dblend_srcalpha );

pdevice->setrenderstate(

d3drs_destblend, d3dblend_invsrcalpha );

pdevice->

setrenderstate( d3dblendop, d3dblendop_add );(預設值,可選)

3.alpha測試

a)原理

根據alpha測試條件來決定當前畫素是否繪製,並不需要對顏色緩衝進行操作,所以速度比alpha混合要快.

b)應用

啟用:pdevice->setrenderstate(

d3drs_alphatestenable, true );

alpha測試函式

d3dcmp_func列舉,預設為d3dcmp_always

參考值:

pdevice->setrenderstate(

d3drs_alpharef, 0x00000081);

D3D深度測試和Alpha混合

1.深度測試 a 深度緩衝區 螢幕上每個畫素點的深度資訊的一塊記憶體緩衝區.d3d通過比較當前繪製的畫素點的深度和對應深度緩衝區的點的深度值來決定是否繪製當前畫素.b d3dpresent parameters.autodepthstencilformat d3dfmt d16 表示深度值由16位二...

D3D渲染效能測試

測試條件 一張 nvidia 1030顯示卡 1個顯示器 30fps,4k 渲染1個4k畫面 gpu 60 fps 45 渲染2個4k畫面 gpu 50 fps 30 渲染3個4k畫面 gpu 57 fps 30 渲染4個4k畫面 gpu 62 fps 30 測試條件 一張 nvidia 1030顯...

D3D基本框架 即D3D標頭檔案分類

了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...