纹理混合

纹理混合


    通常,一块贴在多边形上的纹理数据渲染到用来最终显示的离屏表面(当然不一定是用来显示的离屏表面,下面称为目标表面)时,新的纹理数据是覆盖目标表面上原有数据的。但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 纹理混和产生更复杂的效果。

你可能感兴趣的:(output)