日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记:多重纹理

發布時間:2024/1/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记:多重纹理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記:多重紋理

? (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);

總結

以上是生活随笔為你收集整理的学习笔记:多重纹理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。