2010-08-09 39 views
2

Pour une raison étrange, mon tampon de profondeur ne fonctionne pas, c'est-à-dire que les triangles dessinés ultérieurement se chevauchent toujours, quelle que soit leur position.La mémoire tampon de profondeur DirectX ne fonctionne pas

J'ai ces paramètres de présentateur

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; 

et ces états: render

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 

modifier: Merci pour la réponse. c'est le code de rendu:

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); 

et le code Model::Draw() est la suivante:

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); 
} 

vertexBuffer et indexBuffer avec leurs chefs sont des attributs de la classe.

Voici quelques captures d'écran (FU, protection anti-spam):

1) http://img822.imageshack.us/img822/1705/dx2010080913182262.jpg c'est la situation

2) http://img691.imageshack.us/img691/7358/dx2010080913183790.jpg c'est le (correct) vue lorsque le cube est en face (le cube est dessiné plus tard)

3) http://img340.imageshack.us/img340/4720/dx2010080913184509.jpg Mais quand j'ai la pyramide tronquée à l'avant, le cube chevauche encore

il est plus facile de voir lorsque vous déplacez la caméra vous ...

+1

0. Captures d'écran serait bien. 1. Où est le vrai code de rendu triangulaire? Il pourrait être cassé, donc ce serait bien de voir tout ce qui se passe entre BeginScene() 'et Present()' 2. 'SetRenderState (D3DRS_LIGHTING, TRUE);' n'allume pas l'éclairage __off__. 3. Pourquoi ne supprimez-vous pas le tampon de couleur? 'd3dDevice-> Effacer (0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);'. Si vous n'effacez pas le tampon de couleur, vous obtiendrez des résultats visuels «étranges». – SigTerm

+0

Essayez-vous de rendre un modèle 3D à partir d'un fichier .x ou créez-vous des triangles manuellement avec du code? –

+0

Merci d'avoir répondu. J'ai ajouté un peu plus de code ci-dessus. Concernant l'éclairage: le commentaire est faux, j'ai des lumières de travail dans la scène. –

Répondre

2

Maintenant c'est un gotcha. Le problème était de régler le plan de vue proche à 0.0f - quand je l'ai changé à quelque chose comme 0.001f, le tampon z a soudainement commencé à fonctionner.

+0

Il était probablement (et c'est une supposition, je n'ai pas de formules à portée de main) lié à une division par 0 lorsque le plan proche était à 0. Vous pouvez généralement, en fonction de l'échelle de votre scène (allons avec 1 unité = 1 pouce) mettez-le à 1 sans problèmes visibles. Il est préférable de le placer un peu plus loin, de sorte que vous puissiez extraire le plus de précision possible du tampon de profondeur (les 5% les plus proches de la scène utilisent les 95% inférieurs du tampon disponible, donc plus votre plan est proche , plus vos tests de profondeur seront précis pour). – ssube