学习笔记:多重纹理
學習筆記:多重紋理
? (2009-09-01 14:20:52) 轉載▼| ? | 分類:?學習筆記 |
多重紋理
多重紋理就是在渲染一個多邊形的時候可以用到多張紋理圖.把多張紋理圖進行一些顏色的操作,可以達到一些效果.但是多重紋理必須是在顯卡支持的情況下.但是還有一種多次渲染.可以替代多重紋理,但是這樣做的話,速度會很慢.
多重紋理的相關代碼如下:
//設置第一張紋理
??Device->SetTexture(0,CubeTex);
??//把這張紋理用來渲染第一組多邊行
??Device->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
??//設置這個紋理階段的紋理顏色為紋理的顏色.
??Device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
??//多這個階段的紋理進行選擇COLORARG1的操作
??Device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
??//設置第2張紋理
??Device->SetTexture(1,tex1);
??//把這張紋理用來渲染第一組多邊形
??Device->SetTextureStageState(1,D3DTSS_TEXCOORDINDEX,0);
??//設置第一個顏色為本紋理顏色.
??Device->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);
??//設置第2個顏色為上一個紋理階段的顏色
??Device->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT);
??//把他們兩個文理顏色進行調制,得到的就是最后渲染的紋理顏色,Final=tex1*tex2;(Modulate)
??Device->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_MODULATE);
?
多次渲染可以得到相同的結果.代碼如下:
//設置第一個紋理
??Device->SetTexture(0,CubeTex);
??/渲染一個立方體/
??Device->SetStreamSource(0,VB,0,sizeof(Vertex));
??Device->SetIndices(IB);
??Device->SetMaterial(&CubeMtrl);
??Device->SetFVF(Vertex::FVF);
??Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,24,0,12);
??Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
????????///
??//設置第二個紋理.
??//先設置混合為開
??Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
??//設置源的混合比重為0
??Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
??//目標的混合比重為源的顏色,具體的混合運算為Final=src*0+dest*src=dest*src;和上面的多紋理一樣
??Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
??//設置紋理的第一個參數是0,應為這是用的混合.
??Device->SetTexture(0,tex1);
??Device->SetStreamSource(0,VB,0,sizeof(Vertex));
??Device->SetIndices(IB);
??Device->SetMaterial(&CubeMtrl);
??Device->SetFVF(Vertex::FVF);
??Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,24,0,12);
??Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
????????///
??//設置混合為關閉的
??Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
具體效果如下:
原始的圖1:,原始的圖2:,混合后的:;
多重紋理的操作類型
多重紋理的操作類型,
D3DTOP_DISABLE:使一個紋理階段不管用,自己的理解.
D3DTOP_SELECTARG1 & D3DTOP_SELECTARG2:選擇第一個和第2個紋理,用來混合.
D3DTOP_MODULATE:把兩個紋理的顏色進行乘法運算,final=tex1*tex2;
D3DTOP_MODULATE2X:把兩個紋理的顏色進行乘法運算,然后乘2來提高亮度,final=(tex1*tex2)<<1;
D3DTOP_MODULATE4X:把兩個紋理的顏色進行乘法運算,然后乘4來提高亮度,final=(tex1*tex2)<<2;
D3DTOP_ADD:把兩個紋理的顏色進行加法運算,得到的圖象會變亮,final=tex1+tex2;
D3DTOP_ADDSIGNED:final=tex1+tex2-0.5,得到的效果是第2張圖片的黑的地方邊的更暗,而白地方邊的更亮
D3DTOP_ADDSIGNED2X:在上面的基礎上,把圖片放亮,final=(tex1+tex2+0.5)<<1;
D3DTOP_SUBTRACT:把第一個紋理的亮度,根據第2個紋理來降低,final=tex1-tex2;
D3DTOP_BLENDDIFFUSEALPHA:用頂點上的透明值來線形混合紋理,final=tex1*alpha+tex2*(1-alpha);
D3DTOP_BLENDTEXTUREALPHA:用紋理的透明值來混合紋理
D3DTOP_BLENDFACTORALPHA:用紋理因子來混合
D3DTOP_BLENDTEXTUREALPHAPM:final=tex1*tex2(1-alpha);
D3DTOP_BLENDCURRENTALPHA:用上一張紋理的透明來混合.
D3DTOP_MODULATEALPHA_ADDCOLOR:final=tex1+tex1a*tex2;
D3DTOP_MODULATEINVALPHA_ADDCOLOR:final=tex1+(1-tex1a)*tex2.
/
黑暗映射:用到是D3DTOP_MODULATE;
混合紋理與材質慢反射顏色:這個效果,是用慢反射的到的顏色,來混合紋理顏色.具體代碼如下,
Device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
Device->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
Device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_ADD);
發光映射:用到是D3DTOP_ADD.
細節映射:用到就是D3DTOP_ADDSIGNED.讓暗亮更加分明
/
ALPHA操作
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
Device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
用材質的顏色和ALPHA來混合紋理.
紋理因子的使用(TEXTUREFACTOR)
Device->SetRenderState(D3DRS_TEXTUREFACTOR,0xFF000000);第2個參數是一個32位的顏色值.可以用這個來設置物體的透明度.具體方法如下!
?Device->SetRenderState(D3DRS_TEXTUREFACTOR,0x00000000);
??Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TFACTOR);
??Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
??
??Device->SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
??Device->SetRenderState(D3DRS_SRCBLEND,?D3DBLEND_SRCALPHA);
??Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
總結
- 上一篇: 微信小程序自定义函数返回值
- 下一篇: [幽默网文]2009高考作文语录