ZBuffer Problem
-
Hi,
ich hab ein Problem mit dem einschalten vom ZBuffer...
Sobald ich den ZBuffer einschalte wird einfach nix mehr gezeichnet und ich seh mein 3D Model überhaupt nicht mehr. Sobald ich ihn ausschalte ist es wieder da.Hatte jemand schon mal was ähnliches und kann mir einen Tipp geben?
Woher kann so ein Fehler kommen?Der Code mittlerweile ziemlich viel.
Trotzdem hier mal das Setup der 3D Camera:void CCamera::Setup3DCamera() { LPDIRECT3DDEVICE9 pDirect3DDevice = SallyAPI::Core::CGame::GetDevice(); D3DXMATRIX matView; // the view transform matrix D3DXMATRIX matProjection; // the projection transform matrix // The aspect ratio of how many horizontal pixels are used per vertical pixel float aspect = (float)m_iScreenWidth / (float)m_iScreenHeight; D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // the camera position &D3DXVECTOR3( 0.0f, 0.0f, 1.0f ), // the look-at position &D3DXVECTOR3( 0.0f, 1.0f, 0.0f )); // the up direction D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), // the horizontal field of view aspect, // aspect ratio 1.0f, // the near view-plane 1000.0f); // the far view-plane pDirect3DDevice->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection //Make sure that the z-buffer and lighting are enabled pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_USEW); pDirect3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); pDirect3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE); pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); }
Und die den init der PresentParameters:
bool CGame::InitialisePresentationParameters() { //Create a structure to hold the settings for our device ZeroMemory(&m_PresentParameters, sizeof(m_PresentParameters)); m_PresentParameters.Windowed = m_bWindowd; m_PresentParameters.BackBufferCount = 1; m_PresentParameters.BackBufferFormat = m_DisplayMode.Format; m_PresentParameters.BackBufferWidth = m_DisplayMode.Width; m_PresentParameters.BackBufferHeight = m_DisplayMode.Height; m_PresentParameters.hDeviceWindow = m_hWnd; m_PresentParameters.SwapEffect = D3DSWAPEFFECT_FLIP; m_PresentParameters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //m_PresentParameters.MultiSampleType = m_MultiSampleType; //Select the best depth buffer, select 32, 24 or 16 bit if(m_pDirect3D->CheckDeviceFormat(m_iDeviceId, D3DDEVTYPE_HAL, m_DisplayMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK) { m_PresentParameters.AutoDepthStencilFormat = D3DFMT_D32; m_PresentParameters.EnableAutoDepthStencil = TRUE; m_pLogger->Info("32bit depth buffer selected"); return true; } else if(m_pDirect3D->CheckDeviceFormat(m_iDeviceId, D3DDEVTYPE_HAL, m_DisplayMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) == D3D_OK) { m_PresentParameters.AutoDepthStencilFormat = D3DFMT_D24X8; m_PresentParameters.EnableAutoDepthStencil = TRUE; m_pLogger->Info("24bit depth buffer selected"); return true; } else if(m_pDirect3D->CheckDeviceFormat(m_iDeviceId, D3DDEVTYPE_HAL, m_DisplayMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) == D3D_OK) { m_PresentParameters.AutoDepthStencilFormat = D3DFMT_D16; m_PresentParameters.EnableAutoDepthStencil = TRUE; m_pLogger->Info("16bit depth buffer selected"); return true; } m_PresentParameters.EnableAutoDepthStencil = FALSE; m_pLogger->Error("Unable to select depth buffer."); return false; }
Er wählt den 24bit buffer aus...
Wäre noch ein Teil vom Code interessant?
Danke schon mal!
-
Also genau sagen kann ich dirs nicht, allerdings köntne es sein das er hiermit Probleme hat.
pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_USEW);
probier heir mal statt D3DZB_USEW true, evtl isses das ja direkt.
Außerdem ein paar Anmerkungen.
pDirect3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
Die beiden Befehle sind jeweils der Standartwert, die musst du nicht Extra setzen.
In deienr Projektionsmatrix nimmst du 45° nimm lieber was zwischen 60 und 70, das sieht besser aus.
-
hatte auch schon das probiert:
pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
gleicher effect...
Und diese zwei Zeilen hab ich nur aus Verzweiflung hinzugefügt...
pDirect3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
danke für den Tipp mit dem Field of View! Werde ich ändern
-
Also wenn es angezeigt wird wennd er Z-Bufefr aus ist spricht das dafür das irgendetwas davor gerendert wird, das könnte sogar ne transparente Fläche sein, dadurch wird das Model das dahinterliegt verdeckt, wenn du selbst nichts renderst überprüf mal das Model, ich hatte es selbst schon das um das eigentliche Model Boxen waren die im Modeler ausgeblendet waren und im Programm dann ihre volle wirkung entfaltet haben.
-
Hey danke...
Das war zwar nicht das Problem, hat mich aber auf die Lösung gebrachtDer vorletzte Parameter war bei mir 0.0f ...
m_pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
Danke noch mal!!!