2010-08-09 34 views
2

由于某种奇怪的原因,我的深度缓冲区不起作用,即稍后绘制的三角形总是重叠,无论它们的位置如何。DirectX深度缓冲不起作用

我有这些主持人参数

D3DPRESENT_PARAMETERS d3dpp; 

ZeroMemory(&d3dpp, sizeof(d3dpp)); 
d3dpp.Windowed = TRUE; 
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
d3dpp.hDeviceWindow = mWindow; 

d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
d3dpp.BackBufferWidth = mScreenWidth; 
d3dpp.BackBufferHeight = mScreenHeight; 

d3dpp.EnableAutoDepthStencil = TRUE; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 

和渲染状态:

d3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); // turn off the 3D lighting 
d3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE); // turn on the z-buffer 
d3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); 
d3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(50, 50, 50)); // ambient light 

编辑: 感谢回答。这是渲染代码代码:

d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 

d3dDevice->BeginScene(); 
// View transform 
D3DXMATRIX matView; 
D3DXMatrixLookAtLH(&matView, 
        &PlayerPos, // the camera position 
        &(LookAtRelative + PlayerPos), // the look-at position 
        &D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction 
d3dDevice->SetTransform(D3DTS_VIEW, &matView); 

// Projection transform 
D3DXMATRIX matProjection; 
D3DXMatrixPerspectiveFovLH(&matProjection, 
          D3DXToRadian(45), // the horizontal field of view 
          (FLOAT)mScreenWidth/(FLOAT)mScreenHeight, // aspect ratio 
          0.0f, // the near view-plane 
          1000.0f); // the far view-plane 
d3dDevice->SetTransform(D3DTS_PROJECTION, &matProjection); 



for (unsigned int i=0; i < mModels.size(); i++) { 
    mModels[i]->Draw(); 
} 

d3dDevice->EndScene(); 
d3dDevice->Present(NULL, NULL, NULL, NULL); 

Model::Draw()代码是这样的:

void Model :: Draw() { 
// Setup the world transform matrix 
D3DXMATRIX matScale; 
D3DXMATRIX matRotate; 
D3DXMATRIX matTranslate; 
D3DXMATRIX matWorldTransform; 

D3DXMatrixScaling(&matScale, mScale->x, mScale->y, mScale->z); 
D3DXMatrixRotationY(&matRotate, 0); 
D3DXMatrixTranslation(&matTranslate, mPosition->x, mPosition->y, mPosition->z); 

matWorldTransform = matScale * matRotate * matTranslate; 
d3dDevice->SetTransform(D3DTS_WORLD, &matWorldTransform); 

d3dDevice->SetFVF(CUSTOMFVF); 
d3dDevice->SetStreamSource(0, vertexBuffer, 0, sizeof(CUSTOMVERTEX)); 
d3dDevice->SetIndices(indexBuffer); 

d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertexCount, 0, indexCount/3); 
} 

其中vertexBufferindexBuffer与他们的计数类的属性。

这里有一些截图(FU,垃圾邮件防护):

1)http://img822.imageshack.us/img822/1705/dx2010080913182262.jpg这是形势

2)http://img691.imageshack.us/img691/7358/dx2010080913183790.jpg这是(正确)视图时立方体在前面(多维数据集后来绘制)

3)http://img340.imageshack.us/img340/4720/dx2010080913184509.jpg但是,当我在前面的截棱锥,立方体还是重叠

它更容易看到当你自己的移动相机...

+1

0.屏幕截图会很好。 1.实际的三角形渲染代码在哪里?它可能被破坏,所以在BeginScene()和Present()之间看到__everything__会很高兴。2. SetRenderState(D3DRS_LIGHTING,TRUE);不会打开光照__off__。 3.为什么不清除颜色缓冲区? 'd3dDevice-> Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0x00000000,1.0f,0);'。如果你不清除颜色缓冲区,你会得到“奇怪”的视觉效果。 – SigTerm 2010-08-09 00:39:57

+0

您是试图从.x文件渲染3D模型,还是使用代码手动创建三角形? – 2010-08-09 01:45:24

+0

感谢您的回复。我在上面添加了更多的代码。关于照明:评论是错误的,我在场景中有工作灯。 – 2010-08-09 11:02:43

回答

2

现在这是一个问题。问题是我将近景平面设置为0.0f - 当我将它改为类似0.001f的东西时,z缓冲区突然开始工作。

+0

当近平面为0时,它可能(并且这是一种猜测,我没有方便的公式)与0相关。通常情况下,根据场景的规模(让我们一起去1个单位= 1英寸)将其设置为1,没有任何可见问题。你最好将它设置得更远一些,这样你就可以从深度缓冲区中获得最高的精度(场景中最接近的5%占用可用缓冲区的95%),所以离你的近平面越远,深度测试将会更加准确)。 – ssube 2010-08-09 21:26:10