深度测试Alpha混合方法Alpha测试

转载自:http://blog.csdn.net/xoyojank/article/details/2058566

1.       深度测试

// 深度测试公式为:srcZValue opr destZValue,测试成功则写入后台缓存
    // 深度测试,默认是开启的。
    Device->GetRenderState( D3DRS_ZENABLE, &dwZEnable);// 默认为TRUE
    // 通过改变深度测试函数可以改变渲染的深度像素,或者清空深度缓存再进行物体的绘制,例如镜面中的茶壶就需要这样设置
    Device->GetRenderState( D3DRS_ZFUNC, &dwZEnable); // 默认为D3DCMP_LESSEQUAL;
    // 当深度测试成功后,更新深度缓存的方式,和模板缓存一样
    Device->GetRenderState( D3DRS_ZWRITEENABLE, &dwZEnable); // 默认为TRUE


a)          深度缓冲区:屏幕上每个像素点的深度信息的一块内存缓冲区.D3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素.
b)         D3DPRESENT_PARAMETERS. AutoDepthStencilFormat =  D3DFMT_D16
表示深度值由16位二进制表示
开启深度测试:pDevice->SetRenderState(   D3DRS_ZENABLE, TRUE );
深度测试函数:D3DRS_ZFUNC:
D3DCMP_NEVER
总是返回FALSE
D3DCMP_LESS ( 常用 )
小于深度缓冲区的相应值时返回TRUE
D3DCMP_EQUAL
等于
D3DCMP_LESSEQUAL
小于等于
D3DCMP_GREATER
大于
D3DCMP_NOTEQUAL
不等于
D3DCMP_GREATEREQUAL
大于等于
D3DCMP_ALWAYS
总是返回TRUE
更新缓冲区:保持深度缓冲区不变还是用当前像素的深度值更新
pDevice->SetRenderState(   D3DRS_ZWRITEENABLE, TRUE );
2.        Alpha混合
a)          原理:Color = (RGB src  * K src) OP (RGB dst  * K dst)
最常用的方法:Color = (RGB src  * Alpha src) + (RGB dst  * (1 – Alpha src)
 
b)         应用
启用:pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
Blend mode factor
Description
D3DBLEND_ZERO
(0, 0, 0, 0)
D3DBLEND_ONE
(1, 1, 1, 1)
D3DBLEND_SRCCOLOR
(Rs, Gs, Bs, As)
D3DBLEND_INVSRCCOLOR
(1-Rs, 1-Gs, 1-Bs, 1-As)
D3DBLEND_SRCALPHA
(As, As, As, As)
D3DBLEND_INVSRCALPHA
(1-As, 1-As, 1-As, 1-As)
D3DBLEND_DESTALPHA
(Ad, Ad, Ad, Ad)
D3DBLEND_INVDESTALPHA
(1-Ad, 1-Ad, 1-Ad, 1-Ad)
D3DBLEND_DESTCOLOR
(Rd, Gd, Bd, Ad)
D3DBLEND_INVDESTCOLOR
(1-Rd, 1-Gd, 1-Bd, 1-Ad)
D3DBLEND_SRCALPHASAT
(f, f, f, 1); f = min(As, 1-Ad)

Alpha混合方法

alpha混合公式,blend融合其实都是在渲染物体和后台缓存之间的:

Color = (ARGBsrc * Alphasrc) + (ARGBdst * (1 – Alphasrc) )的设置示例:
其实写入后台缓存了以后Alpha通道是被丢弃了的。其实效果也就是:
Color = (RGB src  * Alpha src ) + (RGB dst  * (1 – Alpha src ) )


D3DBLENDOP_ADD
源计算结果与颜色缓冲区计算结果相加
D3DBLENDOP_SUBTRACT
源计算结果减去颜色缓冲区计算结果
D3DBLENDOP_REVSUBTRACT
颜色缓冲区计算结果减去源计算结果
D3DBLENDOP_MIN
MIN(源计算结果, 颜色缓冲区计算结果)
D3DBLENDOP_MAX
MAX(源计算结果, 颜色缓冲区计算结果)

pDevice->SetRenderState(   D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState(   D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice-> SetRenderState( D3DBLENDOPD3DBLENDOP_ADD );(默认值,可选)

3.       Alpha测试

// Alpha测试的公式是:srcAlphaValue opr refValue
// 当前需要渲染的物体的像素颜色是左操作数,比较函数测试成功,那么渲染通过的alpha值。
 // alpha测试是在光栅化阶段的,也就是阶段纹理后面最终确定顶点和像素颜色后,才会进行alpha测试

DWORD dwAlphaTest;
    Device->GetRenderState( D3DRS_ALPHATESTENABLE, &dwAlphaTest); // 默认是false
    Device->GetRenderState( D3DRS_ALPHAFUNC, &dwAlphaTest);// 默认是D3DCMP_ALWAYS
    Device->GetRenderState( D3DRS_ALPHAREF, &dwAlphaTest ); // 默认是 0
    Device->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
    Device->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
    Device->SetRenderState( D3DRS_ALPHAREF, (DWORD)0x000000FF);


a)          原理
根据Alpha测试条件来决定当前像素是否绘制,并不需要对颜色缓冲进行操作,所以速度比Alpha混合要快.
b)         应用
启用:pDevice->SetRenderState(   D3DRS_ALPHATESTENABLE, TRUE );
Alpha测试函数
D3DCMP_FUNC枚举,默认为D3DCMP_ALWAYS
参考值:
pDevice->SetRenderState(   D3DRS_ALPHAREF, 0x00000081);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值