深度測試與alpha混合(3)

2022-02-26 10:55:08 字數 2700 閱讀 3340

alpha源混合係數通常設定為d3dblend_srcalpha,即當前繪製畫素的alpha值。目標混合係數設定為d3dblend_invsrcalpha,即1減去當前繪製畫素的alpha值。那麼當前繪製畫素的alpha值又是如何得到的呢?如果沒有使用材質和紋理,當前繪製畫素的alpha值來自每個頂點顏色設定的alpha值;如果使用光照和材質,則當前畫素的alpha值來自物體表面材質;如果為物體表面使用了紋理,則alpha值還與紋理有關。

頂點alpha

如果在程式中直接指定每個頂點的顏色,則可以直接給出每個頂點顏色的 alpha值,可以在定義頂點時直接宣告該頂點的alpha值,也可以在程式執行時動態地修改頂點的alpha值。有了頂點的alpha值,渲染物件中每個畫素的alpha值由該物件的alpha值和著色模式決定。當著色模式為flat著色模式時,構成物件的各個多邊形中所有畫素的alpha都等於該多邊形的第乙個頂點的alpha值。當著色模式為gouraud著色模式時,每個多邊形面上的畫素的alpha值由它的各個頂點的alpha值進行線性插值得到的。

示例程式:

圓筒在不斷的繞x, y, z軸旋轉。

按下數字鍵"1",啟用alpha頂點混合

按下數字鍵"0",禁用alpha頂點混合

源程式:

#include 

<

d3dx9.h

>

#pragma warning(disable : 

4127

)    

//disable warning: conditional expression is constant

#define

#define

release_com(p)    do  } while(0)

typedef unsigned 

char

uchar;

idirect3d9

*g_d3d;

idirect3ddevice9

*g_device;

idirect3dvertexbuffer9

*g_vertex_buffer;

struct

scustomvertex

;#define

d3dfvf_custom_vertex (d3dfvf_xyz | d3dfvf_diffuse) 

void

setup_world_matrix()

void

setup_view_proj_matrices()

void

init_vb()

g_vertex_buffer

->

unlock();

}bool

init_d3d(hwnd hwnd)

init_vb();

setup_view_proj_matrices();

g_device

->

setrenderstate(d3drs_cullmode, d3dcull_none);

g_device

->

setrenderstate(d3drs_lighting, false);

g_device

->

setrenderstate(d3drs_alphablendenable, true);

g_device

->

setrenderstate(d3drs_srcblend,  d3dblend_srcalpha);

g_device

->

setrenderstate(d3drs_destblend, d3dblend_invsrcalpha);

return

true;}

void

cleanup()

inline 

void

extract_argb(d3dcolor color, uchar

*alpha, uchar

*red, uchar

*green, uchar

*blue)

void

render()

g_vertex_buffer

->

unlock();

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混合(3)

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

深度測試與alpha混合(3)

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

深度測試與alpha混合(5)

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