转载自: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
D3DCMP_NEVER
|
总是返回FALSE
|
D3DCMP_LESS (
常用
)
|
小于深度缓冲区的相应值时返回TRUE
|
D3DCMP_EQUAL
|
等于
|
D3DCMP_LESSEQUAL
|
小于等于
|
D3DCMP_GREATER
|
大于
|
D3DCMP_NOTEQUAL
|
不等于
|
D3DCMP_GREATEREQUAL
|
大于等于
|
D3DCMP_ALWAYS
|
总是返回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融合其实都是在渲染物体和后台缓存之间的:
D3DBLENDOP_ADD
|
源计算结果与颜色缓冲区计算结果相加
|
D3DBLENDOP_SUBTRACT
|
源计算结果减去颜色缓冲区计算结果
|
D3DBLENDOP_REVSUBTRACT
|
颜色缓冲区计算结果减去源计算结果
|
D3DBLENDOP_MIN
|
MIN(源计算结果, 颜色缓冲区计算结果)
|
D3DBLENDOP_MAX
|
MAX(源计算结果, 颜色缓冲区计算结果)
|
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);