缓冲区Alpha Blend

来源:互联网 发布:php库存管理系统 编辑:程序博客网 时间:2024/06/11 09:56

(demo)源代码下载

Alpha blend

Alpha混合通常是为了实现透明效果,透明效果的程度通过alpha值来控制,对于一个8bit的alpha chanel,可以产生0-255级透明效果,0表示完全透明,255表示完全不透明,在D3D中alpha值的来源主要有三种.


颜色混合方程 

 

其中op在这里定义为混合操作

共有五种形式

ADD表示相加操作,即

SUBTRACT表示相关(目标-源),即

REV_SUBTRACT表示反射的相关(源-目标),即

MIN表示取源、目标颜色中较小值,即

MAX表示取源、目标颜色中较大值,即



融合因子:

D3DBLEND_ZERO 融合因子=(0,0,0,0)
D3DBLEND_ONE 融合因子=(1,1,1,1)
D3DBLEND_SRCCOLOR 融合因子=(R_src,G_src,B_src,A_src)
D3DBLEND_INVSRCCOLOR 融合因子=(1-R_src,1-G_src,1-B_src,1-A_src)
D3DBLEND_SRCALPHA 融合因子=(1-A_src,A_src,A_src,A_src)
D3DBLEND_INVSRCALPHA 融合因子=(1-A_src,1-A_src,1-A_src,1-A_src)
D3DBLEND_DESTALPHA 融合因子=(A_dst , A_dst, A_dst  , A_dst)
D3DBLEND_INVDESTALPHA 融合因子= (1-A_dst, 1-A_dst, 1-A_dst , 1-A_dst ).
D3DBLEND_DESTCOLOR 融合因子=(R_dst , G_dst, B_dst  , A_dst).
D3DBLEND_INVDESTCOLOR 融合因子= (1 - R_dst, 1 - G_dst, 1 - B_dst, 1 - A_dst).
D3DBLEND_SRCALPHASAT 融合因子= (f, f, f, 1),其中f = min(A_src,1 - A_dst)


其中R_src  , G_src , B_src  , A_src分别表示源(即source)像素的红、绿、蓝、透明四个分量值,而R_dst  , G_dst, B_dst  , A_dst表示目标(即destination)像素的红、绿、蓝、透明四个分量值。




下面我们用GLSL 来简单实现一下其中的一些效果.

BlendOp = Add;
SrcBlend = One;
DestBlend = Zero;

实现的效果,和没有用AlphaBlendEnable效果一样.




BlendOp = Add;
SrcBlend = One;
DestBlend = One;

这是原操作数为一,目的操作数也为一的时候的效果,加上以前的反射效果,已经很好的模仿玻璃材质



当然我们使用下面这种效果时,源操作数为0,目的操作数为1 时候,就看不见Teapot了

BlendOp = Add;
SrcBlend = Zero ;
DestBlend = One;



下面我们使用源融合为源颜色

BlendOp = Add;
SrcBlend = SrcColor ;
DestBlend = One;



我们接着使用源融合为源颜色,目的融合为目的颜色

BlendOp = Add;
SrcBlend = SrcColor ;
DestBlend = DestColor;


AlphaFunc 

函数的参数有 Never, Less, LEqual, Equal, Greater, NotEqual, GEqual, Always
这里有一张tga格式的图片,设置一下参照
AlphaTestEnable = true;
AlphaRef = 0xa0;
AlphaFunc = Greater;
可以得到下面这种镂空的效果

(demo)源代码下载

2 0
原创粉丝点击