《Direct3D纹理颜色混合方法分析》由会员分享,可在线阅读,更多相关《Direct3D纹理颜色混合方法分析(14页珍藏版)》请在金锄头文库上搜索。
1、目录引言 2一、Direct3D多层纹理映射过程2二、Direct3D 多层纹理混合方法4三、常用纹理颜色混合操作5(一)黑暗映射5(二)混合纹理与材质漫反射颜色 6(三)混合黑暗贴图与材质漫反射颜色 7(四)发光映射 9(五)细节映射 10结束语 12参考文献 13摘要多层纹理映射是一种高级的纹理映射技术,纹理颜色混合是多层纹理映 射的核心内容,它决定了多层纹理映射最后的效果。使用多层纹理映射的关 键是理解多层纹理之间的颜色混合方法,本文首先分析了 Direct3D 多层纹 理混合的过程和方法,然后通过介绍了常用的几种多层纹理颜色混合应用。 关键词:Direct3D,纹理映射,多层纹理,纹理
2、颜色混合Direct3D 纹理颜色混合方法分析引言纹理映射是三维图形开发中的一个基本内容,多层纹理映射是一种高级 的纹理映射技术,通过多层纹理映射可以一次将多个纹理图片映射到同一个 物体表面。纹理颜色混合是多层纹理映射的核心内容,它决定了多层纹理映 射最后的效果。Direct3D提供了多种多层纹理映射的颜色混合方法,以适应 不同需要。、Di rect3D多层纹理映射过程Direct3D最多支持8层纹理,也就是说在一个三维物体的表面可以同时 拥有18张不同的纹理贴图。Direct3D能够在一个渲染过程中把这些纹理 颜色依次混合,渲染到同一个物体的表面。每一个纹理层对应从07的索 引序号,多层纹理
3、映射能够模拟更为真实的三维世界。例如,要显示具有周 围景物倒影的光滑大理石地板,可以把大理石地板贴图设置为纹理层 0,把 具有周围景物倒影的贴图设置为纹理层1,然后通过设置Direct3D多层纹理 混合操作,把纹理层0和纹理层1相混合,这是绘制出的三维物体就同时具 有大理石地板和景物倒影的纹理颜色。利用Direct3D多达8层的纹理混合, 可以在图形显示系统中显示丰富多彩的图像。Direct3D多层纹理混合过程如 图 1 所示。通过图 1可以看出 8 层纹理是逐层混合,然后输出的,也就是说最多需 要 8 个阶段完成纹理映射,而且每一阶段都是独立进行的,针对每一阶段都 需要设置相应的颜色值的混合
4、方法等纹理阶段混合状态。所以一个纹理层就 相当于一个纹理阶段,多层纹理映射有时也称为多阶段纹理混合。其中,是否应用纹理层17,即是否进行17纹理阶段的操作,可由 应用程序指定,但它们的选择必须是顺序的。也就是说,在没有使用第n层 的情况下,第 n+1 层不能使用。默认情况下, 第 一个纹理操作阶段 (阶段 0)的 默认操作是 D3DT0P_M0DULATE;其它纹理操作阶段的默认操作是D3DT0P_DISABLE。即默 认情况下Direct3D使用单层纹理映射绘制图形,除纹理层0夕卜,纹理层1 7 都是禁用的。IDirec t3DDevice9: Set Tex tu reS tageS ta
5、t e()函数用来设置纹理阶段 混合状态,它将数值 07 作为第一个参数,表示纹理阶段序号。在上面的 代码中,把 D3DTSS_COLOROP 作为第二个参数,表示将要设置纹理层的颜色 混合运算;对于纹理层17,把D3DT0P_DISABLE作为第三个参数,表示禁 用当前纹理层颜色操作。将上面代码中的参数D3DT0P_DISABLE更改为枚举类型D3DTEXTUREOP的 任意值,可激活该纹理层混合操作,混合方法由D3DTEXTUREOP枚举值定义。 D3DTEXTUREOP 的定义及其各枚举常量的具体含义将在后面详细说明。二、Di rect3D多层纹理混合方法纹理映射本质上就是从纹理中获取颜
6、色值,然后应用到物体的表面,多 层纹理映射本质上就是混合多层纹理的颜色,然后应用到物体表面。为了处 理上的方便,Direct3D将颜色的RGB通道和Alpha通道分别进行处理,具体 的操作方法通过纹理阶段状态进行设置。与纹理相关的颜色操作和Alpha混 合操作比较复杂,所以本节专门分别详细介绍纹理颜色混合操作和Alpha混 合操作的相关内容。设置纹理颜色混合操作的代码大致如下所示:pd3dDevice-SetTextureStageState( i, D3DTSS_COLORARG1, arg1 ); pd3dDevice-SetTextureStageState( i, D3DTSS_COL
7、ORARG2, arg2 ); pd3dDevice-SetTextureStageState( i, D3DTSS_COLOROP, op );一般的,用渲染状态D3DTSS_C0L0RARG1和D3DTSS_C0L0RARG2指定当前 纹理层和下一层纹理层混合时的两个颜色参数:argl、arg2,用渲染状态 D3DTSS_C0L0R0P指定混合方式op。Direct3D使用下面的方法进行纹理混合。Colorstage = D3DTSS_COLOROP ( D3DTSS_COLORARG1,D3DTSS_COLORARG2 )渲染状态 D3DTSS_COLOROP 用来指定纹理 RGB 通道
8、混合方式,它们是属 于枚举类型D3DTEXTRUE0P的常量。对于多层纹理颜色混合,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, D3DTSS_COLORARG1, D3DTA_TEXTUR
10、E ); pd3dDevice-SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);/g_pDarkTex ture指向一张模拟光照黑色表面效果的纹理,如图3所示pd3dDevice-SetTexture( 1, g_pDarkTexture );pd3dDevice-SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );pd3dDevice-SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice-Se
11、tTextureStageState( 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, TRUE ); pd3dDevice-SetMaterial( &mtrl );pd3dDevice-SetTexture( 0, g_
13、pBaseTexture );pd3dDevice-SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); pd3dDevice-SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice-SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );pd3dDevice-SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADD ); pd3dDevice-SetT
14、extureStageState( 1, D3DTSS_COLOROP,D3DTOP_DISABLE );示例程序 TexColorBlend 实现的混合纹理与材质漫反射颜色的效果如图 5 所示:为纹理阶段颜色混合Toggle ful screenToggle REF (F3)Change device (F2)67.28 fps Vsync on (640x480). X8RBG8B8 (D24X8)HAL (sim vp): Intel(R) 82845G/GL/GE/PE/GV Graphics Controller 視合牧理与祠质漫反射破色(ri Io lude):QurtU SC2:
15、 土昭鮎电功削3 :盎合菽理与材贋4 :温今嬰暗贴图与材嚴漫反射張色5 :发光咬射6:细节映射图 5 混合纹理与材质漫反射颜色三) 混合黑暗贴图与材质漫反射颜色当你站在一间伸手不见五指的房间内,你无法看清周围的任何颜色。于 是你打开灯光,突然之间,物体的颜色便呈现了出来,就好像是被火焰点燃 了一样。对于这种效果,可以通过黑暗贴图与材质的漫反射颜色的混合来模 拟。可以先将一张纹理与一个材质的漫反射颜色相混合,再将这个结果与前 面讲到的黑暗映射结合起来,在示例程序TexColorBlend中,实现这一效果的代码如下:pd3dDevice-SetRenderState( D3DRS_LIGHTING, TRUE ); pd3dDevice-SetRenderState( D3DRS_AMBIENT, 0x00808080 ); pd3dDevice-SetLight( 0, &light );pd3dDevice-LightEnable( 0, TRUE );pd3dDevice-SetMaterial( &mtrl );/ g_pBaseTex ture指向一张背景墙壁纹理pd3dDevice-SetTexture( 0, g_pBaseTexture);pd3dDevice-SetTextur