启用和关闭模板缓存:
Device->SetRenderState(D3DRS_STENCILENABLE,true);
... // do stencil work
Device->SetRenderState(D3DRS_STENCILENABLE,false);
用IDrece3DDevice9::Clear方法来清除模板缓存并让其拥有默认值,在清除后缓存和深度缓存使用的是同
样的方法。
Device->Clear(0, 0,
D3DCLEAR_TARGER | D3DCLEAR_ZBUFFER | D3DCLAER_STENCIL,
0xff000000, 1.0f, 0 );
这个例子中,我们将模板缓存清除为0,实际上有6中值可以用来指定清除后的模板缓存。
请求一个模板缓存
模板缓存和深度缓存是同时创建的,指定深度缓存的格式的时候,我们同时指定模板缓存的格式,他们两
个分享同一个离屏表面缓存,他们的每个像素被指定到各自缓存内存片段内。有3中深度/模板缓存格式:
D3DFMT_D24S8 创建一个32为的深度/模板缓存,24位为深度缓存,8位为模板缓存;
D3DFMT_D24X4S4 32的,24位为深度缓存,4位为模板缓存,4位预留;
D3DFMT_D15S1 16位的深度/模板缓存,15位为深度缓存,1位为模板缓存。
当然了,还有一些格式没有分配给任何模板缓存,例如 D3DFMT_D32 创建一个32位的深度缓存。注意,有
些硬件显卡是不支持8位模板缓存的。
模板测试 (stencil test)
通过模板测试来阻止特殊像素被写:
(ref & mask) ComparisonOperation (value & mask) 模板测试是对每个像素进行的,假设模板是被允许
。 有两个操作:
左手边操作数 (LHS = ref&mask)
右手边操作数 (RHS = value&mask) 模板测试比较LHS 和 RHS,通过比较运算来指定。全部运算得到一个
BOOL值。TREU则把像素写入后缓存。FALSE阻止写入。不能被写入后缓存,就不能被写入深度缓存。
通过控制指定参考值和掩码,用于模板测试,不能指定模板值,但是可以控制写入模板缓存的值。
设置模板参考值,REF默认值为0
Device->SetRenderState(D3DRS_STENCILREF, 0x1);
模板掩码MASK用来掩饰在REF和VALUE变量中的位,默认值为0xffffffff,就是没有任何掩饰位。掩饰高十
六位 Device->SetRenderState(D3DRS_STENCILMASK, 0x0000ffff);
镜面反射矩阵的创建
D3DXMATRIX *D3DXMatrixReflect(
D3DXMATRIX *pOut, // The resulting reflection matrix.
CONST D3DXPLANE *pPlane // The plane to reflect about.
);