关于深度测试的
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
g_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
问题一:
D3DXMatrixTranslation(&matWorld, 0.0f, 0.0f, 5.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
g_pMeshTeapot->DrawSubset(0);
因为我茶壶的z坐标是5,比深度缓存的大了,深度测试又是D3DCMP_LESS,为什么茶壶还会画出来?
问题二:
当设置了这条语句后
g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);
g_pd3dDevice->Clear 语句是否又会深度缓存置为1.0f
问题三:
msdn对clear上的解释有(倒数第二个参数)
Clear the depth buffer to this new z value which ranges from 0 to 1.
为什么只是0 - 1, 在帮助文档并没有详细说明, 这三个问题困扰我一天了。
[解决办法]
楼主理解错了:
深度缓存是变换到投影空间后的Z值,也就是屏幕上的Z值;那个5是茶壶在三维空间的z坐标,它再经过视图投影变换才能对应到深度缓存上去。要想彻底搞清,你得知道视图变换和投影变换是怎样运算的。