游戏开发基础(七)

 

第七章
融合技术能使我们将当前要进行光栅化的像素与先前已光栅化并处于同一位置的像素的颜色进行合成。
即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合),利用该技术,我们可以获得各种各样的效果,尤其是透明效果。
这种将当前计算得到的像素(源像素)颜色值与先前计算所得的像素(目标像素)颜色值进行合成的做法称为融合
注意,融合的效果并不局限于普通玻璃类型的透明效果
在融合运算时,必须遵循以下原则:
首先绘制那些不需要进行融合的物体,然后将需要进行融合的物体按照相对于摄像机的深度值进行排序,如果物体已处于观察坐标系中,该运算的效率会相当高,因为此时只需对z分量进行排序,最后,按照自后往前的顺序逐个绘制将要进行融合运算的物体。
对两个像素颜色值进行融合处理的公式:
OutputPixel = SourcePixel*SourceBlendFactor + DestPixel * DestBlendFactor
公式中的每个变量都是一个4D颜色向量(r,g,b,a)符号*表示分量逐个相乘
OutputPixel 融合后的颜色值
SourcePixel 当前计算得到的,用于与后台缓存中对应像素进行融合的像素颜色值
SourceBlendFactor 源融合因子,指定了源像素的颜色值在融合中所占比例,该值在区间[0,1]内
DestPixel 当前处于后台缓存中的像素颜色值
DestBlendFactor 目标融合因子,指定了目标像素的颜色值在融合中所占的比例,该值在区间[0,1]内

源融合因子和目标融合因子使我们可以各种方式修改源像素和目标像素的颜色值,从而可以获得各种不同的效果
Direct3D中,默认状态下都是禁止融合运算的,可将绘制状态D3DRS_ALPHABLENDENABLE设为true,便启用运算
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);

注意:融合的计算开销并不低,所以应该仅在必须得场合中使用,当您绘制完需要进行融合的几何体之后,应禁止Alpha融合,在对三角形单元组进行融合时,最好进行批处理,之后应立即绘制出来,这样就可避免在每帧图像中都启用和禁止融合运算


通过设定源融合因子和目标融合因子,我们可创建一系列不同的融合效果
可通过设置绘制状态D3DRS_SRCBLEND 和D3DRS_DESTBLEND的值来对源融合因子和目标融合因子分别进行设定。
Device->SetRenderState(D3DRS_SRCBLEND,Source);
Device->SetRenderState(D3DRS_DESTLEND,Destination);
其中,Source和destination可取下列融合因子
D3DBLEND_ZERO blendFactor = (0,0,0,0)
D3DBLEND_ONE blendFactor = (1,1,1,1)
D3DBLEND_SRCCOLOR blendFactor = (rs,gs,bs,as)
D3DBLEND_INVSRCCOLOR blendFactor = (1-rs,1-gs,1-bs,1-as)
...........
源融合因子和目标融合因子的默认值分别是D3DBLEND_SRCALPH D3DLEND_INVSRCALPHA
每个顶点颜色中的Alpha分量与颜色值类似,都是沿着三角形单元表面渐变的,但它并非用于确定某像素的颜色值,而是用于确定像素的Alpha分量。
Alpha分量主要用于指定像素的透明度,假定我们为每个像素的Alpha分量保留了8位,则该Alpha分量的合法区间是[0,255],其中,[0,255]对应于透明度[%0,100%].当Alpha值为0,该像素就是完全透明的,如果像素的Alpha值为128,其透明度就是50%,而Alpha值为255的像素就是完全不透明的。
为了能够用Alpha分量来描述像素的透明度,我们必须将源融合因子和目标融合因子分别设置为D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA,这些值恰好也是融合因子的默认值。

我们并不直接使用计算得到的Alpha分量,而往往是从纹理的Alpha通道中获取Alpha信息,Alpha通道是保留给存储了Alpha分量的纹理元的一个额外的位集合。当纹理映射到某个图元中时,Alpha通道中的Alpha分量也进行了映射,并成为该图元中像素的Alpha分量。

默认状态下,如果当前设置的纹理拥有一个Alpha通道,Alpha值就取自该Alpha通道,如果没有Alpha通道,Alpha值就取自顶点的颜色,但也可以用下列绘制状态来指定Alpha值得来源(漫反射颜色值或Alpha通道)
//compute Alpha from diffuse colors during shading
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTA_SELECTARG1);
// take Alpha from Alpha channel
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTA_SELECTARG1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值