用Direct3D设计淡入淡出的效果

演示程序下载地址:http://download.csdn.net/detail/jiangcaiyang123/4156592


以前写过一篇有关用Direct3D设计淡入淡出的效果的文章,现在看来那真是煞笔啊。一年多后,我自己又深入地了解了Direct3D的原理,再加上自己的一些实验,现在终于实现了淡入·淡出效果。
为了帮助速成,我就简单地说。在光栅化的时候,将会执行颜色混合的操作。这里也包括Alpha混合。由于微软的Direct3D是不开源的,所以我们无法接触每一个像素的值,但是微软为我们提供了一些函数,使用这些函数我们可以几近完全控制我们想要的效果。在纹理和顶点混合的初期,我们可以调用IDirect3DDevice9::SetTextureStageState函数来进行操作。下面是这个函数的声明:

HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );

这里我也简单地介绍一下。Stage表示的是纹理的层。如果是多纹理的话,使用它可以指定想要混合的纹理的层。比如两个纹理混合,那么可以设置第0层的混合情况,也可设置第1层的混合情况,这有助于设置一些复杂的纹理效果。Type来自于一系列枚举类型,Value是指在Type下的一些值。取决于Type。 【用Direct3D设计淡入淡出的效果】
好了,要实现淡入淡出的效果,那么顶点最好声明为:

struct STVertex// 定义自己的顶点结构体 { void Set( float _x, float _y, float _u, float _v )// 设置顶点坐标 { x = _x, y = _y, z = 0.0f, u = _u, v = _v, rhw = 1.0f; } float x, y, z, rhw; // 纹理坐标位置 unsigned long color; // 颜色 float u, v; // 纹理坐标内的位置 };


其中rhw是与二维图形相关的,这里可以忽略。注意成员声明的顺序。灵活顶点格式为:
static const unsigned short TEXTURE_FVF = D3DFVF_XYZRHW | D3DFVF_TEX1 | D3DFVF_DIFFUSE; // 灵活顶点格式
在初始化的时候,注意调用我们刚才说的SetTextureStageState()函数。并且在纹理混合的下一阶段注意开启Alpha混合。这些代码如下所示:

// 设置纹理和顶点混合 g_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); g_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); g_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); // 设置Alpha混合 g_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); g_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); g_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

首先,将D3DTSS_ALPHAARG1的值设为D3DTA_TEXTURE,这意味着Alpha混合的第一个参数来自于纹理,然后D3DTSS_ALPHAARG2的值设为D3DTA_DIFFUSE。还记得我们设置的灵活顶点格式FVF吗?它含有D3DFVF_DIFFUSE,我们的顶点也有一个颜色成员,这意味着第二个参数来自于我们设置顶点的颜色。最后将D3DTSS_ALPHAOP设为D3DTOP_MODULATE,它表明使用的是调制的方式,这个很重要,因为我们所需的淡入淡出效果就是这么来的。它的工作原理是S(RGBA) = Arg1 × Arg2。将两个Alpha值相乘。还有一些可用的参数比如说D3DTOP_MODULATE2X和D3DTOP_MODULATE4X,它们都是在原有的基础上乘以2和4,用来加亮的。除非特意使用这样的效果,否则还是使用D3DTOP_MODULATE比较好。

随后是SetRenderState()函数了。首先它开启了Alpha混合模式,可以进行Alpha混合,随后它指定了源混合和目标混合。可以用多种混合模式可供选择,但是实现半透明效果,我见到的只能像上面那样设置。

最后的效果呢,就是我们可以使用自己定义的顶点的Alpha值控制我们混合后的Alpha值了。我这里也自己制作了一个演示的程序,大家感兴趣的话可以从这里下载。
http://download.csdn.net/detail/jiangcaiyang123/4156592

    推荐阅读