问题5-Blending

下面的问题是混合(Blending),就像图中看到的一样,三个物体都是半透明状态,要实现这种效果,就要用到Blending技术。

blending

使用的混合的时候,要注意顺序,首先要绘制不使用混合的物体,在这个例子中就是背景墙和地板了,然后再绘制需要混合的物体。绘制要混合的物体的时候也要注意按照Z
轴的方向从远到近来绘制。

混合后的颜色是通过下面的公式来计算的:

OutputPixel = SourcePixel * SourceBlendFactor + DestPexel * DestBlendFactor

这里乘法颜色向量的分量相乘。在公式中:

OutputPixel:混合后的像素。
SourcePixel:源像素。
SourceBlendFactor:源像素在混合中的比例,在[0,1]之间取值。
DestPexel:目的像素。
DestBlendFactor:目的像素在混合中的比例,在[0,1]之间取值。

在混合之前,要使用 SetRenderState(D3DRS_ALPHABLENDENABLE, true) 来激活混合选项。然后设置混合如下:

Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );


这里第一个参数分别设置了源混合像素和目的混合像素。第二个参数是混合的方式,可选值很多,具体的混合方式可以参看SDK。一般都使用D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。它们分别表示:

D3DBLEND_SRCALPHA
Blend factor is (As, As, As, As).
D3DBLEND_INVSRCALPHA
Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).

图中显示了两种Blengding形式,一种是基于D3DMATERIAL9对象的Diffuse属性的Alpha值,一种是使用带有Alpha通道的纹理贴图。所以在混合的时候还要指定使用哪一种混合。如下:

//使用Diffuse的Alpha值
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);


//使用带有Alpha通道的贴图
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);


该函数的原型是:
HRESULT SetTextureStageState(
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
);


第一个参数是指定的纹理层,第二个参数指定纹理层表现类型,第三个参数可以在D3DTEXTUREOP中指定,也可以在D3DTA中指定。更多的信息也可以在SDK中查看。

最后,使用了混合后,在不用的时候要立即关闭。

SetRenderState(D3DRS_ALPHABLENDENABLE, false)

自我介绍

Author:三只熊熊
大家好,欢迎来到我的blog!
目前我正在韩国攻读游戏工学研究生,现在在虚拟现实实验室。
作为刚踏入游戏开发领域的初学者,希望大家多多帮助!

잘 부탁드립니다~ ^_^

最新文章
最新留言
最新引用
月份存档
类别
计数器
搜寻栏
RSS连结
连结
Powered By FC2博客

马上开始博客吧!!

Powered By FC2博客