通常,一块贴在多边形上的纹理数据渲染到用来最终显示的离屏表面(当然不一定是用来显示的离屏表面,下面称为目标表面)时,新的纹理数据是覆盖目标表面上原有数据的。但d3d提供了新纹理数据跟原有数据按一定比例混合的能力,这就是纹理混和。纹理混和可以实现透明,光照等多种特效,在3d程序中是极常用的技术,下面分几部分说明:
1.Alpha 纹理混和(Alpha Texture Blending)
当d3d根据当前材质,顶点颜色,光照,以及纹理最后计算出一个多边形图像上某一个象素的颜色时,如果打开了纹理混和,就把这个颜色(源颜色)跟目标表面上对应的像素的颜色(目标颜色)按下面这个公式计算出混和后的颜色,放入目标表面。
混和后的颜色 = 源颜色 × 源混和系数 + 目标颜色 × 目标混和系数
源混和系数和目标混和系数是两个在0.0到1.0之间的数,缺省值分别是D3DBLEND_SRCALPHA(源Alpha值)、D3DBLEND_INVSRCALPHA(1.0-源Alpha值)。通过IDirect3DDevice7::SetRenderState可以设置这两个系数,第一参数传入 D3DRS_SRCBLEND 或 D3DRS_DESTBLEND ,第二个参数传入D3DBLEND类型。
Alpha混和的使用步骤一般如下:
(1).通过 IDirect3DDevice7::SetTexture 和 IDirect3DDevice7::SetTextureStageState 设置第0层的纹理状态。
(2).画场景。
(3).改变第0层的纹理状态。
(4).通过IDirect3DDevice7::SetRenderState打开Alpha混和,并设置相关参数。
(5).重复(2),(3),(4)。
可以看到,"画场景"是要重复多次的,所以,这种纹理混和被称为多次纹理混和(Multipass Texture Blending)。
2.单次多重纹理混和(Single Pass Multiple Texture Blending)
在上面的"多次纹理混和"中,"画场景"的操作要重复多次,浪费了时间,所以,出现了一种新的技术,称为"单次多重纹理混和"。顾名思义,这种技术只"画场景"一次,节省了时间。D3D通过"纹理层(Texture Stage)"来实现这种混和,可以把每一层纹理想象成画着图案的透明玻璃,然后把好几块不同图案的玻璃叠在一起,看到的图案就相当于纹理混和的最终图像。D3D提供了一次混和八层纹理的能力,当然很少有显卡支持这么多,在程序中一般用到三层就足够了。
(1).纹理层(Texture Stages)

请看上面图示,一个纹理层有两个输入:Arg1,Arg2;一个操作:Op;和一个输出:Blended Output。通过IDirect3DDevice7::SetTextureStageState设置纹理层的输入和操作,输出可以作为下一层的一个输入,也可以作为最终结果送去显示。
(2).纹理混和瀑布(texture blending cascade)

一连串的纹理层顺序混和被形象的称为"纹理混和瀑布",图像数据就象水流从第0层开始,在每一层中与新的数据混和后,流入下一层,一直到最后送入目标表面。在D3D中,上图中的N<=7,即最多有八层,依次编号为0~7,混和只能从0层开始,但可以在任一层结束(前提是硬件支持),并且中间不能有跳跃,就是说一旦某层不混和,那么这层就是混和结束的地方(假设第3层不参加混和,那么第3层以后的4,5,6,7就不能参加混和了)。
(3).纹理层的参数设置
在DirectX7.0中,纹理层的状态参数通过IDirect3DDevice7::SetTextureStageState函数。声明如下:
HRESULT SetTextureStageState(
DWORD dwStage,
D3DTEXTURESTAGESTATETYPE dwState,
DWORD dwValue
);
第一个参数dwStage指定哪个纹理层,从0开始。比如要设置第2层,就传入2。
第二个参数指定哪个状态。常用的有:
D3DTSS_COLORARG1 : 输入参数Arg1
D3DTSS_COLORARG2 : 输入参数Arg2
D3DTSS_COLOROP : 操作Op
第三个参数指定状态的值。常用的有:
对应于输入(Arg1和Arg2):
D3DTA_DIFFUSE : 由顶点的diffuse颜色计算出来的值。
D3DTA_CURRENT : 上一层的输出,如该层是第0层,等效于D3DTA_DIFFUSE。
D3DTA_TEXTURE : 该层的纹理数据。(只能用于Arg1)
对应于操作(Op):
D3DTOP_DISABLE : 关闭该层。
D3DTOP_SELECTARG1 : 把输入一(Arg1)作为输出。
D3DTOP_SELECTARG2 : 把输入二(Arg2)作为输出。
D3DTOP_MODULATE : 把 Arg1 × Arg2 作为输出。
D3DTOP_ADD : 把 Arg1 + Arg2 作为输出。
单次多重纹理混和的使用步骤一般如下:
(1).通过 IDirect3DDevice7::SetTexture 和 IDirect3DDevice7::SetTextureStageState 设置第0~N层的纹理状态。
(2).画场景。
在硬件不支持"单次多重纹理混和"时,可以用"多次纹理混和"达到相同的效果,只是要画多次,降低了程序速度。有时候,在单次多重纹理混和之后,还可以用Alpha 纹理混和产生更复杂的效果。