引入
(1)上篇中学习了Alpha混合技术,其中涉及到顶点Alpha和材质Alpha两种。但是Alpha还有一种来源就是纹理(Texture)。另外,通过借助纹理的Alpha值,可以实现纹理的透明效果,这让游戏世界变得更有趣、更逼真!
(2)然而,这里虽然仍是学习Alpha混合,但是涉及到的是纹理Alpha的混合方式,这使得Alpha混合变得不再单纯,并且更加复杂!因为纹理就是一个尤其复杂的主题,想想最多可以设置8个纹理层就能感受的到,仅纹理的渲染状态的选择就够让我们手忙脚乱的,可选的枚举值大概有二十个。所以这里我们先初步了解纹理Alpha混合的使用,更复杂的内容将在后续文章中逐步展开。
Texture Alpha混合中像素Alpha值的形成
当对物体表面使用了纹理之后,像素Alpha值就是纹理Alpha混合之后的值,所以这又取决于纹理的Alpha混合方法,纹理Alpha混合方法决定了纹理Alpha混合之后的Alpha值是取自材料还是取自纹理,或者取自两者的某种运算。
像素的Alpha值的具体计算过程是这样的,首先得到顶点Alpha值,顶点Alpha值可能是直接指定的,也可能是光照计算得到的,然后根据着色模式对顶点Alpha值进行插值,得到的结果再根据纹理Alpha混合方法和纹理采样得到的Alpha值进行指定的运算,得到最终每个像素的Alpha的值。其中,纹理的混合方法与之前纹理颜色的混合方法基本相同,区别是纹理Alpha混合的结果是像素的Alpha值,纹理颜色混合的结果是像素颜色的RGB值。
“纹理阶段混合状态”
纹理映射本质上是从纹理中获取颜色值,然后应用到物体的表面,多层纹理映射本质上就是混合多层纹理的颜色,然后应用到物体的表面。为了处理上的方便,Direct3D将颜色的RGB通道和Alpha通道分别进行处理,具体的操作方法通过纹理阶段混合状态进行设置。也即纹理阶段混合状态用于指定当前纹理阶段(总共有八个阶段,即Stage0到Stage7)纹理颜色值和Alpha值的混合方法。
由于纹理混合对RGB颜色值混合和Alpha值混合是分别处理的,所以本节只讨论纹理的Alpha值混合,RGB颜色值混合在之后的文章中介绍,并且本节中只涉及1层(即第0层)纹理,所以相对好理解的多!
我们分几个步骤来介绍“纹理阶段混合状态”的设置方法:
(1)LPDIRECT3DDEVICE9::SetTextureStageState()函数的使用
(2)设置纹理渲染状态
(3)设置纹理渲染状态值
(4)“纹理混合状态”与纹理的Alpha混合
(1)LPDIRECT3DDEVICE9::SetTextureStageState()函数的使用
纹理混合状态由LPDIRECT3DDEVICE9::SetTextureStageState()设置,该函数的声明如下:
HRESULT SetTextureStageState() {
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
};