Z-Buffer(DirectX9)



  • Hi,

    ich will mit dem Borland C++ Builder 5 und DirectX ein Programm schreiben, dass ein mesh aus einer .x-file laden soll, und es dann anzeigt.
    Bis jetzt besteht das mesh lediglich aus ein paar zusammengebauten Würfeln.
    Das Problem ist nun man zum Teil durch einen Würfel hindurch die Oberfläche des anderen sehen kann.

    Um dem Problem auf die Spur zu kommen hab ich dann mal das culling ausgeschaltet:

    [cpp]d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);[/cpp]
    

    Dabei wird der Fehler noch deutlicher, weil man durch die Würfel hindurch deren Rückseite sehen kann.

    Ich vermute, dass der Fehler dadurch entsteht, dass der Z-Buffer nicht funktioniert, da ein eingeschalteter Z-Buffer das gleiche Ergebnis liefert, wie ein ausgeschalteter.

    Mein Z-Buffer code sieht wie folgt aus:

    [cpp]//globale Definition des Z-Buffers
    LPDIRECT3DSURFACE9 z_buffer = NULL;
    
    //Die Einstellungen zum Erstellen des Device
    d3dpresent_parameters.EnableAutoDepthStencil = true;
    d3dpresent_parameters.AutoDepthStencilFormat = D3DFMT_D16;
    
    //Erstellung des Z-Buffers
    d3dDevice->CreateDepthStencilSurface( Form1->ClientWidth,     
                                              Form1->ClientHeight,        
                                              D3DFMT_D16,          
                                              D3DMULTISAMPLE_4_SAMPLES, 
                                              0,                   
                                              true,                
                                              &z_buffer,          
                                              NULL)
    
    //"Einschalten" des Buffers
    d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    
    //Leeren des Z-Buffers vorm Rendern
    d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0L);
    [/cpp]
    

    Ich arbeite erst seit kurzem mit DirectX, deshalb hoffe ich, dass es lediglich ein einfach zu lösender Anfängerfehler ist 🙂
    Danke schon mal im voraus!



  • wie steht's mit D3DRS_ZWRITEENABLE oder D3DRS_ZFUNC ?



  • Ich hatte die beiden Render-States in meinem Code bisher nicht auf einen bestimmten Wert gesetzt, und es deshalb gleich mal probiert.

    Das Ergebnis sah wie folgt aus:

    Als ich D3DRS_ZWRITEENABLE auf TRUE bzw. auf FALSE setzte, machte es keinen Unterschied. Der Fehler im Bild trat jeweils wieder auf.

    Als ich D3DRS_ZFUNC auf D3DCMP_LESSEQUAL, D3DCMP_EQUAL, D3DCMP_GREATEREQUAL oder D3DCMP_ALWAYS setzte, trat ebenfalls keine Veränderung ein. Der Fehler wurde leider immer noch im Bild angezeigt.
    Alle anderen Möglichkeiten für D3DRS_ZFUNC (z.B. D3DCMP_LESS oder D3DCMP_NOTEQUAL) lieferten nur ein Bild, auf dem das Mesh garnicht zu sehen war, sondern nur der blaue Hintergrund.



  • d3dDevice->CreateDepthStencilSurface( Form1->ClientWidth,    
                                          Form1->ClientHeight,        
                                          D3DFMT_D16,          
                                          D3DMULTISAMPLE_4_SAMPLES,
                                          0,                  
                                          true,                
                                          &z_buffer,          
                                          NULL)
    

    HRESULT CreateDepthStencilSurface(
    UINT Width,
    UINT Height,
    D3DFORMAT Format,
    D3DMULTISAMPLE_TYPE MultiSample,
    DWORD MultisampleQuality,
    BOOL Discard,
    IDirect3DSurface9** ppSurface,
    HANDLE* pSharedHandle
    );

    Discard
    [in] Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise.

    If this flag is set, the contents of the depth stencil buffer will be invalid after calling either IDirect3DDevice9::Present or IDirect3DDevice9::SetDepthStencilSurface with a different depth surface.


Anmelden zum Antworten