龍書筆記(7)

2021-06-21 12:31:28 字數 2806 閱讀 5753

依照進度,這次說融合...

什麼是融合,就是將當前要進行光柵化的畫素的顏色 與 先前已光柵化並處於同一位置的畫素的顏色 進行合成

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指向符號表中關於這個詞法單元的條目,符號表條目的...