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);
}
où 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 ...
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
Essayez-vous de rendre un modèle 3D à partir d'un fichier .x ou créez-vous des triangles manuellement avec du code? –
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. –