|
|

如上图,我希望的效果是,那个小茶壶不和大茶壶 不重叠显现, 可是仍然重叠显示了
于是把大茶壶那块的模板值设为0x1,...
代码如下(龙书里面的例子,改了一点点):
在一下函数之前,背景(大茶壶,墙,镜子)都渲染OK了
void RenderTwoTeapotAltering()//渲染背景里面(包括墙)的茶壶
{
//设置镜子外茶壶的模板入口值为0x1,再设置参考值为0x1,比较操作为 等于
//这样,最后渲染的镜子内茶壶遍不会覆盖境外茶壶啦
Device->SetRenderState(D3DRS_STENCILENABLE, true);
Device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
Device->SetRenderState(D3DRS_STENCILREF, 0x1);
Device->SetRenderState(D3DRS_STENCILMASK, 0xffffffff);
Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
//通过了深度测试和模板测试的地方,模板入口值为设定的参考值,否则,入口值不变
Device->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
//不让茶壶渲染到深度缓冲
Device->SetRenderState(D3DRS_ZWRITEENABLE, false);
//不让茶壶渲染到后缓冲,即不画出来
Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
//因为模板测试总是成功,则茶壶画的地方,模板入口值可变为0x1
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
Device->SetTransform(D3DTS_WORLD, &I);
Device->SetMaterial(&TeapotMtrl);
Device->SetTexture(0,NULL);
Teapot->DrawSubset(0);
//后面要写入Z缓冲的,恢复更改Z缓冲功能
Device->SetRenderState( D3DRS_ZWRITEENABLE, true );
// only draw reflected teapot to the pixels where the mirror
// was drawn to.
Device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_NOTEQUAL);
Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);//不需要改变模板值了
// position reflection
D3DXMATRIX W, T, R;
D3DXPLANE plane(0.0f, 0.0f, 1.0f, 0.0f); // xoy plane
D3DXMatrixReflect(&R, &plane);
D3DXMatrixTranslation(&T,
TeapotPosition.x,
TeapotPosition.y,
TeapotPosition.z);
W = T * R;
Device->SetTransform(D3DTS_WORLD, &W);
Device->SetMaterial(&TeapotMtrl);
Device->SetTexture(0, 0);
//将茶壶显示在最前面,甚至会镜子外茶壶的前边
Device->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);//仅注释它,看效果
//使用颜色混合,改变茶壶在最前面的颜色,增加真实感
Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);//仅注释这两句,
Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);//看效果
//等价与
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
//当把摄像机转到镜子后面时,茶壶没了,是因为和黑色混合了
Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
Teapot->DrawSubset(0);//画对称的茶壶,背面消影
Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
//关闭模板
Device->SetRenderState( D3DRS_STENCILENABLE, false);
}
关于模板,以及三种类型的BUFFER,求指点。。。 |
|