依照進度,這次說融合...
什麼是融合,就是將當前要進行光柵化的畫素的顏色 與 先前已光柵化並處於同一位置的畫素的顏色 進行合成
1.融合方程
outputpixel = sourcepixel (*) sourceblendfactor + destpixel (*) destblendfactor
中文解釋為:
融合結果 = 當前畫素顏色值 * 源融合因子 + 當前後台中的畫素顏色值 * 目標融合因子
這裡的符號(*)表示逐個相乘,每個變數都是4d顏色向量(r,g,b,a)
融合運算遵循的規則:
首先繪製不需要融合的物體,然後將需要融合的物體按照相對於攝像機的深度值進行排序;
如果物體已處於觀察座標系中,運算效率會很高,因此只需對z分量進行排序,
最後按從後到前的順序逐個繪製要進行融合運算的物體
direct3d中預設是禁止融合運算的,開啟的方法是,使用完畢記得設定為false,因為要繪製的其他模型不一定也使用融合:
device->setrenderstate(d3drs_alphablendenable, true);
//rendering...
device->setrenderstate(d3drs_alphablendenable, false);
注意:在對三角形單元進行融合時,最好進行批處理,之後立即繪製出來,然後禁止alpha融合,這是因為融合的運算開銷並不小
2.融合因子
可以通過設定繪製狀態 d3drs_srcblend 和 d3drs_destblend 的值
device->setrenderstate(d3drs_srcblend, source); //預設值是 d3dblend_srcalpha
device->setrenderstate(d3drs_destblend, destination); //預設值是 d3dblend_invsrcalpha
source和destination可取的值很多:
d3dblend_zero
d3dblend_one
d3dblend_srccolor
d3dblend_invsrccolor
d3dblend_srcalpha
d3dblend_invsrcalpha
...3.透明度
在融合中,重點考察的因素是alpha分量和材質
alpha分量主要用於指定畫素的透明度,他的區間是[0,255]:0是完全透明,128是半透明,255是不透明
為了能使用alpha分量來描述透明度,還必須指定源融合因子和目標融合因子,巧的是,這裡使用的正好是他們的預設值
alpha通道:
通常是從紋理的alpha通道中獲取alpha資訊:當紋理隱射到某個圖元中時,alpha通道也隱**alpha分量,並成為該圖元的alpha分量
預設狀態下,alpha值取自紋理的alpha通道,但是如果沒有,alpha就取自頂點的顏色,也可以像這樣來指定:
//從漫射顏色值取
device->settexturestagestate(0, d3dtss_alphaarg1, d3dta_diffuse);
device->settexturestagestate(0, d3dtss_alphaop, d3dtop_selectarg1);
//從紋理alpha通道取
device->settexturestagestate(0, d3dtss_alphaarg1, d3dta_texture);
device->settexturestagestate(0, d3dtss_alphaop, d3dtop_selectarg1);
//注意!如果沒有指定alpha通道,只指定融合因子,系統會自動選擇合適的通道
小問題:使用 頂點通道需要設定燈光和材質, 使用 紋理通道則不用 燈光和材質
4.例程分析,主要思路如下:
teapotmtrl.diffuse.a = 0.5f;
device->settexturestagestate( 0, d3dtss_alphaarg1, d3dta_diffuse );
device->settexturestagestate( 0, d3dtss_alphaop, d3dtop_selectarg1 );
device->setrenderstate( d3drs_srcblend, d3dblend_srcalpha );
device->setrenderstate( d3drs_destblend, d3dblend_invsrcalpha );
//世界、觀察、投影矩陣設定...
//繪製背景
device->setmaterial( ... );
device->settexture( ... );
device->setfvf( ... );
device->setstreamsource( ... );
device->drawprimitive(...);
//繪製茶壺
device->setrenderstate( d3drs_alphablendenable, true );
device->setmaterial( &teapotmtrl );
device->settexture( 0,0 );
teapot->drawsubset( 0 );
device->setrenderstate( d3drs_alphablendenable, false );
龍書筆記(6)
這次說說紋理.借助紋理對映,可以將 影象資料 對映到 三角形單元中。idirect3d中用 idirect3dtexture9 表示紋理介面 是乙個類似表面的畫素矩陣,與表面不同的是他可被對映到三角形單元中 1.紋理座標 紋理座標系 紋理空間 由水平方向u軸 和 垂直方向v軸 組成,利用 座標對 u...
龍書筆記(8)
chap 8 模版 stencil 快取 功能 阻止後台快取中某些特定區域的繪製 1.模版快取的使用 啟用和禁用模版快取 device setrenderstate d3drs stencilenable,true device setrenderstate d3drs stencilenable,...
龍書筆記 引論
編譯器的第乙個步驟稱為詞法分析或掃瞄。詞法分析器讀入組成源程式的字元流,並且將它們組成有意義的詞素序列。對於每個詞素,詞法分析器產生如下形式的詞法單元 token 作為輸出 token name語法分析步驟使用的抽象符號,attribute value指向符號表中關於這個詞法單元的條目,符號表條目的...