龍書筆記(8)

2021-06-21 12:57:16 字數 3160 閱讀 9140

chap 8 模版(stencil)快取

功能:阻止後台快取中某些特定區域的繪製

1.模版快取的使用

啟用和禁用模版快取:

device->setrenderstate(d3drs_stencilenable, true);

device->setrenderstate(d3drs_stencilenable, false);

清空模版快取,此方法也能清空深度快取和後台快取:

device->clear(0,0,d3dclear_target | d3dclear_zbuffer | d3dclear_stencil, 0xff000000, 1.0f, 0);		//最後乙個引數說明模板快取要清空為0

模版快取的格式:

d3dfmt_d24s8

d3dfmt_d24x4s4

d3dfmt_d15s1

就是在建立裝置的時候,d3dpresent_parameters 那個結構裡面

模版測試

就是判定是否將某個畫素寫入後台快取的決策過程(測試結果為 true 就把此畫素寫入後台):

(ref(模版參考值) & mask(模版掩碼))comparisonoperation(value(當前模版快取的數值) & mask(模版掩碼))

comparisonoperation前面的是左值,後面

右值預設是0,可以修改:

device->setrenderstate(d3drs_stencilref, 0x1);

(2).模版掩碼 mask:

遮蔽ref或者value中的某些位,預設是 0xffffffff, 表示不遮蔽任何位

可以修改:

device->setrenderstate(d3drs_stencilmask, 0x0000ffff);				//表示遮蔽了高16位

(3).模版值 value:

不能顯示的單獨設定模版值,但可以對模版進行清空操作,還可以通過 模版的繪製狀態 控制寫入模版快取的內容

(4).比較運算:

通過繪製狀態 d3drs_stencilfunc 來設定比較運算,常用的值有:

d3dcmp_never			//模版測試總是失敗,比較函式總是返回false

d3dcmp_less //若左值 < 右值,模版測試成功

d3dcmp_equal //若左值 == 右值,模版測試成功

d3dcmp_lessequal //若左值 <= 右值,模版測試成功

d3dcmp_greater //若左值 > 右值,模版測試成功

d3dcmp_notequal //若左值 != 右值,模版測試成功

d3dcmp_greaterequal //若左值 >= 右值,模版測試成功

d3dcmp_always //模版測試總是成功,比較函式總是返回true

模版快取的更新

(1).某畫素的模版測試失敗:

device->setrenderstate(d3drs_stencilfail, stenciloperation);

(2).某畫素的深度測試失敗:

device->setrenderstate(d3drs_stencilzfail, stenciloperation);

(3).某畫素的深度測試和模版測試均成功:

device->setrenderstate(d3drs_stencilpass, stenciloperation);

//stenciloperation的取值:

d3dstencilop_keep //不更新模版快取中的值

d3dstencilop_zero //將模版快取中的值設為0

d3dstencilop_replace //用模版參考值代替模版快取中的值

//....

模版寫掩碼

遮蔽將寫入模版快取的某位

2.鏡面效果

d3dx提供了如下方法去建立 相對於任意平面的 映象變換 矩陣:

d3dxmatrix* d3dxmatrixreflect(d3dxmatrix* pout, const d3dxplane* pplane);

鏡面效果實現(理論篇):

(1)繪製場景,包括地板、牆壁、鏡面和茶壺,此步 不需修改 模版快取

(2)模版快取 清零

(3)將構成鏡面的圖元 僅 繪製到 模版快取 中,並且讓模版測試總是成功,成功通過的模版快取值被替換為1

//解析:這時,由於只畫了鏡面,所以模版快取中鏡面對應的區域畫素設為1,其餘畫素都為0(這就相當於對鏡面做了標記)

(4)繪製茶壺的 映像 到 後台快取 和 模版快取。(其實是通過先 繪製到模版快取, 進行判斷後, 再寫入 後台快取)

//解析:通過了模版測試,就將茶壺映像繪製到後台快取中

領悟吧!奧義!

後台還快取 是 結果, 模版快取 是手段,

開啟了模版快取,意味著要想在後台快取中繪製,就得先通過「模版的試練」(模版測試)

把要繪製的內容分別放進 後台快取 和 模版快取,在模版快取中去測試,如果測試結果正確,就在後台快取中繪製!

鏡面效果實現(實戰篇):

//(1)

void rendermirror() //注意,這個函式只是繪製了鏡面的部分

3.陰影效果

direct3d中的陰影矩陣:

d3dxmatrix * d3dxmatrixshadow(

d3dxmatrix * pout,

const d3dxvector4 * plight,

const d3dxplane * pplane

);

使用 模版快取 防止二次融合

二次融合:就是乙個物體的陰影中,同乙個位置出現陰影加強的情況

陰影效果實現:

void rendershadow()

龍書筆記(6)

這次說說紋理.借助紋理對映,可以將 影象資料 對映到 三角形單元中。idirect3d中用 idirect3dtexture9 表示紋理介面 是乙個類似表面的畫素矩陣,與表面不同的是他可被對映到三角形單元中 1.紋理座標 紋理座標系 紋理空間 由水平方向u軸 和 垂直方向v軸 組成,利用 座標對 u...

龍書筆記(7)

依照進度,這次說融合.什麼是融合,就是將當前要進行光柵化的畫素的顏色 與 先前已光柵化並處於同一位置的畫素的顏色 進行合成 1.融合方程 outputpixel sourcepixel sourceblendfactor destpixel destblendfactor 中文解釋為 融合結果 當前...

龍書筆記 引論

編譯器的第乙個步驟稱為詞法分析或掃瞄。詞法分析器讀入組成源程式的字元流,並且將它們組成有意義的詞素序列。對於每個詞素,詞法分析器產生如下形式的詞法單元 token 作為輸出 token name語法分析步驟使用的抽象符號,attribute value指向符號表中關於這個詞法單元的條目,符號表條目的...