Direct3D纹理颜色溷合方法分析_第1页
Direct3D纹理颜色溷合方法分析_第2页
Direct3D纹理颜色溷合方法分析_第3页
Direct3D纹理颜色溷合方法分析_第4页
Direct3D纹理颜色溷合方法分析_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录引 言2一、Direct3D多层纹理映射过程2二、Direct3D多层纹理混合方法4三、常用纹理颜色混合操作5(一) 黑暗映射5(二) 混合纹理与材质漫反射颜色6(三) 混合黑暗贴图与材质漫反射颜色7(四)发光映射9(五)细节映射10结束语12参考文献13摘 要多层纹理映射是一种高级的纹理映射技术,纹理颜色混合是多层纹理映射的核心内容,它决定了多层纹理映射最后的效果。使用多层纹理映射的关键是理解多层纹理之间的颜色混合方法,本文首先分析了Direct3D多层纹理混合的过程和方法,然后通过介绍了常用的几种多层纹理颜色混合应用。关键词:Direct3D,纹理映射,多层纹理,纹理颜色混合Direc

2、t3D 纹理颜色混合方法分析引 言纹理映射是三维图形开发中的一个基本内容,多层纹理映射是一种高级的纹理映射技术,通过多层纹理映射可以一次将多个纹理图片映射到同一个物体表面。纹理颜色混合是多层纹理映射的核心内容,它决定了多层纹理映射最后的效果。Direct3D提供了多种多层纹理映射的颜色混合方法,以适应不同需要。一、Direct3D多层纹理映射过程Direct3D最多支持8层纹理,也就是说在一个三维物体的表面可以同时拥有18张不同的纹理贴图。Direct3D能够在一个渲染过程中把这些纹理颜色依次混合,渲染到同一个物体的表面。每一个纹理层对应从07的索引序号,多层纹理映射能够模拟更为真实的三维世界

3、。例如,要显示具有周围景物倒影的光滑大理石地板,可以把大理石地板贴图设置为纹理层0,把具有周围景物倒影的贴图设置为纹理层1,然后通过设置Direct3D多层纹理混合操作,把纹理层0和纹理层1相混合,这是绘制出的三维物体就同时具有大理石地板和景物倒影的纹理颜色。利用Direct3D多达8层的纹理混合,可以在图形显示系统中显示丰富多彩的图像。Direct3D多层纹理混合过程如图1所示。arg1arg2op阶段1arg1arg2op阶段2arg1arg2op阶段2第一层纹理元素的颜色漫反射颜色第二层纹理元素的颜色第三层纹理元素的颜色最终像素颜色图1 Direct3D多层纹理混合过程通过图1可以看出8

4、层纹理是逐层混合,然后输出的,也就是说最多需要8个阶段完成纹理映射,而且每一阶段都是独立进行的,针对每一阶段都需要设置相应的颜色值的混合方法等纹理阶段混合状态。所以一个纹理层就相当于一个纹理阶段,多层纹理映射有时也称为多阶段纹理混合。其中,是否应用纹理层17,即是否进行17纹理阶段的操作,可由应用程序指定,但它们的选择必须是顺序的。也就是说,在没有使用第n层的情况下,第n+1层不能使用。默认情况下,第一个纹理操作阶段(阶段0)的默认操作是D3DTOP_MODULATE;其它纹理操作阶段的默认操作是D3DTOP_DISABLE。即默认情况下Direct3D使用单层纹理映射绘制图形,除纹理层0外,

5、纹理层17都是禁用的。IDirect3DDevice9: SetTextureStageState()函数用来设置纹理阶段混合状态,它将数值07作为第一个参数,表示纹理阶段序号。在上面的代码中,把D3DTSS_COLOROP作为第二个参数,表示将要设置纹理层的颜色混合运算;对于纹理层17,把D3DTOP_DISABLE作为第三个参数,表示禁用当前纹理层颜色操作。将上面代码中的参数D3DTOP_DISABLE更改为枚举类型D3DTEXTUREOP的任意值,可激活该纹理层混合操作,混合方法由D3DTEXTUREOP枚举值定义。D3DTEXTUREOP的定义及其各枚举常量的具体含义将在后面详细说明。

6、二、Direct3D多层纹理混合方法纹理映射本质上就是从纹理中获取颜色值,然后应用到物体的表面,多层纹理映射本质上就是混合多层纹理的颜色,然后应用到物体表面。为了处理上的方便,Direct3D将颜色的RGB通道和Alpha通道分别进行处理,具体的操作方法通过纹理阶段状态进行设置。与纹理相关的颜色操作和Alpha混合操作比较复杂,所以本节专门分别详细介绍纹理颜色混合操作和Alpha混合操作的相关内容。设置纹理颜色混合操作的代码大致如下所示:pd3dDevice->SetTextureStageState( i, D3DTSS_COLORARG1, arg1 ); pd3dDevice-&g

7、t;SetTextureStageState( i, D3DTSS_COLORARG2, arg2 );pd3dDevice->SetTextureStageState( i, D3DTSS_COLOROP, op );一般的,用渲染状态D3DTSS_COLORARG1和D3DTSS_COLORARG2指定当前纹理层和下一层纹理层混合时的两个颜色参数:arg1、arg2,用渲染状态D3DTSS_COLOROP指定混合方式op。Direct3D使用下面的方法进行纹理混合。Colorstage = D3DTSS_COLOROP ( D3DTSS_COLORARG1, D3DTSS_COLOR

8、ARG2 )渲染状态D3DTSS_COLOROP用来指定纹理RGB通道混合方式,它们是属于枚举类型D3DTEXTRUEOP的常量。对于多层纹理颜色混合,Direct3D提供了多种混合方式,每种混合方式都有其各自的独特作用。下面示例程序TexColorBlend中演示一些常用的纹理颜色混合操作方法及其效果。三、常用纹理颜色混合操作(一) 黑暗映射在Direct3D中经常采用纹理贴图的方式模拟基于逐像素光照效果,其中纹理贴图的内容正是所期望的光源类型照射在一张漆黑表面上的结果。通过纹理映射来模拟逐像素光照效果,通常是将第一层纹理设置为物体原来的表面纹理,将第二层纹理设置为光照纹理,然后将两张纹理的

9、颜色相乘。所以有时将两张纹理的颜色相乘称为“光照映射(light mapping)”,由于这种技术经常被用于使一张纹理变暗,所以有时也称“黑暗映射(Dark Mapping)”。在示例程序TexColorBlend中实现黑暗映射的代码如下:/g_pBaseTexture指向一张背景纹理,如图2所示pd3dDevice->SetTexture( 0, g_pBaseTexture );pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 0

10、, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );/g_pDarkTexture指向一张模拟光照黑色表面效果的纹理,如图3所示pd3dDevice->SetTexture( 1, g_pDarkTexture );pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState(

11、1, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE ); 图2 背景纹理 图3 光照纹理所实现的黑暗映射效果如图4所示。图4 黑暗映射效果(二) 混合纹理与材质漫反射颜色当很强的阳光照射在物体表面上时,会使它表面的颜色变得更加明亮,这时可以通过将纹理与材质的漫反射颜色相混合来模拟这种效

12、果。当一个白色材质反射一个方向光时,反射量越多就意味着纹理颜色在最终显示结果中所占的成分越少。因此,那些被光直接照射到的表面会呈现出白色。在示例程序TexColorBlend中,使用灯光、材质并实现混合纹理与漫反射颜色的代码如下:pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00808080 );pd3dDevice->SetLight( 0, &light );pd3dDevice->LightEnable( 0,

13、TRUE );pd3dDevice->SetMaterial( &mtrl );pd3dDevice->SetTexture( 0, g_pBaseTexture ); pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_D

14、IFFUSE );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADD );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );示例程序TexColorBlend实现的混合纹理与材质漫反射颜色的效果如图5所示:图5 混合纹理与材质漫反射颜色(三) 混合黑暗贴图与材质漫反射颜色当你站在一间伸手不见五指的房间内,你无法看清周围的任何颜色。于是你打开灯光,突然之间,物体的颜色便呈现了出来,就好像是被火焰点燃了一样。对于这种效果,

15、可以通过黑暗贴图与材质的漫反射颜色的混合来模拟。可以先将一张纹理与一个材质的漫反射颜色相混合,再将这个结果与前面讲到的黑暗映射结合起来,在示例程序TexColorBlend中,实现这一效果的代码如下:pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00808080 );pd3dDevice->SetLight( 0, &light );pd3dDevice->LightEnable( 0, TRUE );pd3dDevi

16、ce->SetMaterial( &mtrl );/ g_pBaseTexture指向一张背景墙壁纹理pd3dDevice->SetTexture( 0, g_pBaseTexture); pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORAR

17、G2, D3DTA_DIFFUSE); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);/ g_pDarkTexture指向一张模拟光照黑色表面效果的纹理pd3dDevice->SetTexture(1, g_pDarkTexture); pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_

18、TEXTURE); pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);示例程序TexColorBlend实现的混合黑暗贴图与材质漫反射颜色的效果如图6所示:图6 混合黑暗映射与材质漫反射颜色如果没有光照,则纹理颜色会乘以0,因此就看不到墙壁纹理了,如果在这种情况下,将只能看到第二张纹理。如果第一张纹理是不可见的,则第一阶段的颜色值0与第二阶段的颜色相乘的结果仍

19、将为0(黑色)。当没有光照在物体的某个表面上时,该面的第一张纹理颜色会减弱为黑色。而当你身处一个真正漆黑的地方时,由于光照微弱,你是无法看到周围物体的颜色的,因此上面的这段代码对于模拟这种情况非常有效。(四)发光映射发光映射(Glow Mapping)与黑暗映射正好相反,它对于模拟那些具有独立于基础贴图的发光部分的物体很有用,比如模拟发光二极管、按钮、建筑物内的灯光、太空船上的灯光等。发光映射应仅影响基础贴图上的发光区域,而不影响其余部分。因此需要对发光效果做加法,而不是做乘法。在示例程序TexColorBlend中,实现发光映射的代码如下:/ g_pBaseTexture指向一张背景墙壁纹理

20、pd3dDevice->SetTexture( 0, g_pBaseTexture );pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );/ g_pDarkTexture指向一张模拟光照黑色表面效果的纹理pd3d

21、Device->SetTexture( 1, g_pDarkTexture );pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );pd3dDevice->SetTextureStageState( 1, D3D

22、TSS_COLOROP, D3DTOP_ADD );示例程序TexColorBlend所实现的发光映射效果如图7所示图7 发光映射通过D3DTOP_SELECTARG1将第一个纹理混合阶段中未修改的颜色输出到下一个纹理混合阶段。然后通过使用D3DTOP_ADD加上第二个纹理操作阶段的颜色。(五)细节映射如果要模拟一块粗糙的石灰泥墙壁,可以通过细节映射(Detail Mapping)来实现。实现过程是,将基础贴图(也就是第一张纹理)的颜色未经修改便作为第二个纹理操作阶段中的第二个参数。然后通过D3DTOP_ADDSIGNED将灰色的细节纹理与基础贴图相加。这个操作本质上是做了一个加法,只是使用了

23、有符号的颜色值(-127128)来代替平时使用的无符号值(0255)。在ADDSIGNED两张纹理时,-127为黑色,128为白色。它将参数的每个成分相加后,再减去偏移量0.5,从而使有效值域变为-0.50.5。但对于一些比较陈旧的显卡,当其不能支持D3DTOP_ADDSIGNED操作时,可以使用D3DTOP_MODULATE2X代替D3DTOP_ADDSIGNED操作进行模拟。在细节贴图中较亮的灰色纹理元素会使基础贴图变得更亮,而较暗的灰色纹理元素会使基础贴图变得更暗。由此可使物体呈现出粗糙的表面,从而使之看上去更为真实。在示例程序TexColorBlend中,实现细节映射的核心代码如下:/

24、 g_pBaseTexture指向一张背景墙壁纹理pd3dDevice->SetTexture( 0, g_pBaseTexture );pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );/ g_pDetailTexture指向一张模拟光照灰色表面效果的纹理,如图12.10所示pd3dDevice->SetTexture( 1, g_pDetailTexture );pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论