透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會感到玻璃好像不存在,在三維圖形程式中渲染時就可以不渲染這些透明度非常高的物體,從而可以提高渲染速度,這可以通過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...