因为当时没有理解这个东西, 导致自己写的一个小的测试程序无论如何不能按照自己的设想的方式工作.
1. 预期目标:
在世界空间中放置一个圆面, 一个正方形面, 还有一个三棱锥体. 让这三个模型围绕世界坐标系Y轴转动.
2. 实际结果:
三个模型都在对应的位置显示出来了, 并且都在围绕围绕坐标抽转动. 但是有个小问题, 按照预期, 转到一定角度, 正方形面有一部分就被圆面挡住了, 但实际情况是无论怎么转, 正方形的面始终能看见.
后来发现那个模型后被画出来, 那个就总显示在前面.
之后为了解决这个改了很多, 也查了很多资料,包括msdn, 还在一个d3d开发群里面问了这个问题,最后还是没有答案.
后来无意中又看到这段代码, 想到可能是深度缓冲的缘故. 然后打开深度缓冲果然问题解决. 下面我把重要部分的代码列出来:
// create device
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
if ( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, m_hMainWin,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&m_pD3DDevice )))
注意红色部分, 这个为了打开深度缓冲, 必须要设置的.
// enable z-buffer
m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
m_pD3DDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESS );
m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
这一步可有可无, 因为默认情况下它的值就是TRUE的. 当然你可以先获取这个值查看是不是TRUE如果不是再设置为TRUE.但是如果这个值FALSE,那么前面设置的那些值也是不会起作用的.
// before rendering
m_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER
,
D3DCOLOR_XRGB( 94,35,118), 1.0f, 0 );
注意红色部分, 这个必须包含.
如果是没有打开深度缓冲, 那么在同一位置, 后画就会把前面的画的给覆盖, 即使前面画的模型的更靠近观察坐标系.
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.