学习笔记:多重纹理

来源:互联网 发布:外贸建站seo 编辑:程序博客网 时间:2024/05/03 01:42

学习笔记:多重纹理

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

0 0
原创粉丝点击