深度測試與alpha混合(5)

2021-06-05 19:41:41 字數 3678 閱讀 3607

透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會感到玻璃好像不存在,在三維圖形程式中渲染時就可以不渲染這些透明度非常高的物體,從而可以提高渲染速度,這可以通過alpha測試來實現。

alpha測試根據當前畫素是否滿足alpha測試條件(即是否達到一定的透明度)來控制是否繪製該畫素,圖形程式應用alpha測試可以有效地遮蔽某些畫素顏色。與alpha混合相比,alpha測試不將當前畫素的顏色與顏色緩衝區中畫素的顏色混合,畫素要麼完全不透明,要麼完全透明。由於無需進行顏色緩衝區的讀操作和顏色混合,因此alpha測試在速度上要優於alpha混合。

alpha測試通過啟用渲染狀態d3drs_alphatestenable來設定,示例**如下:

g_device->setrenderstate(d3drs_alphatestenable, true);

渲染狀態d3drs_alpharef用來設定alpha測試的參考值,alpha測試函式比較當前繪製的畫素的alpha值和參考值,如果返回true,則通過測試並繪製畫素,反之不予繪製。參考值的取值範圍是0x00000000到0x000000ff。

渲染狀態d3drs_alphafunc用來設定alpha測試函式,alpha測試函式屬於d3dcmpfunc列舉型別,預設狀態為d3dcmp_always。下列**設定alpha測試函式為d3dcmp_greater,表示測試點畫素的alpha值大於設定的alpha參考值時則返回true:

g_device->setrenderstate(d3drs_alphatestenable, true);

g_device->setrenderstate(d3drs_alpharef, 0x00000081);

g_device->setrenderstate(d3drs_alphafunc, d3dcmp_greater);

已知藍色玻璃的alpha值為浮點值0.5f,等價於兩位16進製制數0x80,小於程式中設定的alpha測試參考值0x81,並且alpha測試函式被設為d3dcmp_greater,所以藍色玻璃的顏色不會被繪製出來。

按下數字鍵"1",啟用alpha測試。

按下數字鍵"0",禁用alpha測試。

源程式:

#include

<

d3dx9.h

>

#pragma warning(disable :

4127

)#define

#define

release_com(p)    do } while(0)

idirect3d9

*g_d3d;

idirect3ddevice9

*g_device;

id3dxmesh

*g_mesh;

d3dmaterial9

*g_mesh_materials;

idirect3dtexture9

**g_mesh_textures;

dword                    g_num_materials;

void

setup_world_matrix()

void

setup_view_proj_matrices()

bool

init_geometry()

d3dxmaterial

*xmaterials

=(d3dxmaterial

*) material_buffer

->

getbufferpointer();

g_mesh_materials

=new

d3dmaterial9[g_num_materials];

g_mesh_textures    

=new

idirect3dtexture9

*[g_num_materials];

for(dword i =0

; i

<

g_num_materials; i++)

material_buffer

->

release();

return

true;}

bool

init_d3d(hwnd hwnd)if(

!init_geometry())

return

false

;setup_view_proj_matrices();   

g_device

->

setrenderstate(d3drs_zenable,            true);

g_device

->

setrenderstate(d3drs_zfunc,            d3dcmp_less);

g_device

->

setrenderstate(d3drs_zwriteenable,    true);

g_device

->

setrenderstate(d3drs_alphatestenable, true);

g_device

->

setrenderstate(d3drs_alpharef,       

0x00000081

);g_device

->

setrenderstate(d3drs_alphafunc,        d3dcmp_greater);   

g_device

->

setrenderstate(d3drs_ambient,

0xffffbb55

);return

true;}

void

cleanup()

release_com(g_mesh);

release_com(g_device);

release_com(g_d3d);

}void

render()

}       

//render transparent object second

for(dword i =0

; i

<

g_num_materials; i++)

}       

g_device

->

endscene();

g_device

->

present(null, null, null, null);

}lresult winapi winproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)

break

;case

wm_destroy:

postquitmessage(0);

return0;

}return

defwindowproc(hwnd, msg, wparam, lparam);

}int

winapi winmain(hinstance inst, hinstance, lpstr, int)

render();

sleep(

10);}}

cleanup();

unregisterclass(class_name, wc.hinstance);   

return0;

}

深度測試與alpha混合(5)

透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會感到玻璃好像不存在,在三維圖形程式中渲染時就可以不渲染這些透明度非常高的物體,從而可以提高渲染速度,這可以通過alpha測試來實現。alpha測試根據當前畫素是否滿足alpha測試條件 即是否達到一定的透明度 來控制是否繪...

深度測試與alpha混合(3)

alpha源混合係數通常設定為d3dblend srcalpha,即當前繪製畫素的alpha值。目標混合係數設定為d3dblend invsrcalpha,即1減去當前繪製畫素的alpha值。那麼當前繪製畫素的alpha值又是如何得到的呢?如果沒有使用材質和紋理,當前繪製畫素的alpha值來自每個頂...

深度測試與alpha混合(4)

材質alpha 頂點alpha是沒有使用光照和材質的情況,如果對場景內的物體新增光照和材質而沒有新增紋理時,頂點alpha值取決於材質屬性中漫反射顏色的alpha係數和燈光顏色中的alpha係數,頂點alpha值是根據光照計算得到的。頂點光照計算是分別針對紅 綠 藍和alpha進行的,其中alpha...