前言:
融合技术,将当前要进行光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即:将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成,利用该技术,可以获得很多种效果,比如:透明效果。
相关知识说明:
1.融合方程:
当我们处于背景图和茶壶三角形单元进行光栅化计算时,我们需要将计算得到的茶壶的像素颜色和背景图的像素颜色进行合成,以使得背景图透过茶壶得以显示。这种将当前计算得到的像素(源像素)颜色值与先前计算得出的像素(目标像素)颜色值合成的做法就是融合技术。
首先,上方程:OutputPixel = SourcePixelⓧSourceBlendFactor + DestPixel ⓧ DestBlendFactor
简单来说:融合后的颜色值 = 当前计算得出的像素颜色值 ⓧ 源融合因子 + 处于后台缓存的像素颜色值 ⓧ 目标融合因子.。
OutputPixel:融合后的颜色值。
SourcePixel:当前计算得到的、用于与后台缓存中对应像素进行融合的像素颜色值。
SourceBlendFactor :源融合因子,指定了源像素的颜色值在融合中所占的比例。在[0,1]区间内。
DestPixel :当前处于后台缓存中的像素颜色值。
DestBlendFactor:目标融合因子,指定了目标像素的颜色值在融合中所占的比例。在[0,1]区间内。
通过此方程可以看出我们可以通过源融合因子和目标融合因子修改源像素和目标像素的颜色值,以达到不同的效果。
以下强调一点:
融合计算的开销还是比较大的,所以当我们绘制玩需要进行融合的几何体后,一定要禁用融合。在对三角形单元元组进行处理时,之后应该l立刻绘制出来,这样就避免了在每帧图像中都启用和禁用融合运算。
我们通过如下方法进行融合运算的启动和禁用:
// 启用融合运算
_device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
// 禁用融合运算
_device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
2.融合的方式和融合系数整理
通过设定融合因子和目标融合因子,我们可以创建一系列不同的效果。我们通过如下方式设定D3DRS_SRCBLEND 和D3DRS_DESTBLEND的值来对源融合因子和目标融合因子分别设定:
//通过设定D3DRS_SRCBLEND 和D3DRS_DESTBLEND的值来对源融合因子 和目标融合因子分别进行设定。
_device->SetRenderState(D3DRS_SRCBLEND, Source);
_device->SetRenderState(D3DRS_DESTBLEND, Destination);
D3DBLENDOP_ADD 源像素计算结果与目标像素的计算结果相加,即【最终结果】=【源】+【目标】
D3DBLENDOP_SUBTRACT 源像素计算结果与目标像素的计算结果相减,即【最终结果】=【源】-【目标】
D3DBLENDOP_REVSUBTRACT 目标像素的计算结果减去源像素计算结果,即【最终结果】=【目标】-【源】
D3DBLENDOP_MIN 在源像素计算结果和目标像素计算结果之间取小者。即【最终结果】= MIN(【目标】,【源】)
D3DBLENDOP_MAX 在源像素计算结果和目标像素计算结果之间取大者。即【最终结果】= MAX(【目标】,【源】)
Source 和 Destination 可以取下面的值
融合因子:
D3DBLEND_ZERO 融合因子=(0,0,0,0)
D3DBLEND_ONE 融合因子=(1,1,1,1