本文介绍模板技术并实现镜面效果
模板缓存:
模板缓存和深度缓存是同时创建的,在指定深度缓存格式的时候,模板缓存的格式也被同时指定了,语句如下:
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;//24位深度缓存,8位模板缓存
模板缓存的分辨率与深度缓存和后台缓存的分辨率大小相同,
屏幕上的某个像素点都对应着模板缓存、深度缓存和后台缓存中的某个像素值。
模板缓存与深度缓存类似,都需要通过特定的比较来判断是否更新后台缓存的像素,即也有模板测试过程。
启用模板缓存:
要使用模板缓存必须开启其状态,默认为关闭状态,
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);//开启模板缓存
另外在执行清屏动作时,还要使用
D3DCLEAR_STENCIL
清除模板缓存:
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,D3DCOLOR_XRGB(80,80,80),1.0,0);
模板测试:
模板测试的效果与深度测试类似,都是通过特定的比较方式判断某个像素是否应该被写入后台缓存。
测试表达式:
result=(ref & mask) OP (value & writemask)
result为比较结果,ref为模板参考值,mask为模板参考值的掩码,value为当前像素的值,writemask为当前像素的掩码
设置模板参考值:
g_pd3dDevice->SetRenderState(D3DRS_STENCILREF,0x1);//设置模板参考值
设置模板参考值的掩码:
g_pd3dDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);//设置模板测试掩码