Problem mit dem ZBuffer



  • Wenn ich in DX9 ein Modell ohne Z-Buffer lade, ist alles, was vorn ist, von den
    hinteren Polygonen überschrieben und das sieht komisch aus.
    Um richtig,also von hinten nach vorn, zu zeichenen, hab ich mit

    g_pd3dDevice1->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
    g_pd3dDevice1->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    

    den Z-Buffer aktiviert.
    Nun wird aber nichtsmehr angezeigt. Alles schwarz.
    Muss man noch was zusätzlich aktivieren?



  • der zbuffer muss beim erstellen des 3ddevice angegeben werden

    D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    

    und deim löschen mit "clear()" muss der zbuffer gelöscht werden

    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                             D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
    

    steht alles in den tutorials des 9er sdk ausführlich erklärt. auch die beispielprogramme sind sehr gut gemacht. bei solchen fragen immer erst mal dort nachschauen.



  • Ich hab mir ja schon die Tutorials angeguckt und per Google nach weiteren gesucht,
    aber es funktioniert trotzdem nicht. Sobald die Z-Komponente der Vertices
    größer oder kleiner 0 ist, wird das Modell nicht mehr gezeichnet.



  • Ich hab hier mal einen Beispielcode. Es wird wird ein Rechteck mit Textur gezeichnet.
    Sobald man an der Z-Komponente rumspielt wirds nicht mehr angezeigt,
    obwohl ich glaube alles richtig eingestellt zu haben.

    #include <d3d9.h>
    #include <d3dx9tex.h>
    #include <d3dx9core.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include "Globals.h"
    #include "Modell.h"
    #include "Shape.h"
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE|D3DFVF_TEX1)
    
    LPDIRECT3D9             g_pD3D       = NULL; 
    LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; 
    LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; 
    LPDIRECT3DTEXTURE9		g_pTexture		= NULL;
    LPD3DXSPRITE			g_pSprite		= NULL;
    LPDIRECT3DINDEXBUFFER9	g_pIndex		= NULL;
    Modell m1;
    
    HWND hWnd=NULL;
    LOGFONT lf;
    
    HRESULT InitD3D( HWND hWnd )
    {
    
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            return E_FAIL;
    
    	D3DDISPLAYMODE d3ddm; 
    	if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) 
        return E_FAIL;
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = d3ddm.Format;
    	d3dpp.EnableAutoDepthStencil = TRUE; 
    	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) )
        {
            return E_FAIL;
        } 
    
    	g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
        return S_OK;
    }
    
    HRESULT InitVB()
    {
    
        if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                      0, D3DFVF_CUSTOMVERTEX,
                                                      D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
        {
            return E_FAIL;
        }
    
        CUSTOMVERTEX* pVertices;
        if( FAILED( g_pVB->Lock( 0, sizeof(pVertices), (void**)&pVertices, 0 ) ) )
            return E_FAIL;
    
    	pVertices[0].x=100;pVertices[0].y=100;pVertices[1].z=0;pVertices[0].rhw=0;pVertices[0].color=0xffffffff;
    	pVertices[0].tv=0.0f;
    	pVertices[0].tu=0.0f;
    	pVertices[1].x=500;pVertices[1].y=100;pVertices[1].z=0;pVertices[0].rhw=0;pVertices[1].color=0xffffffff;
    	pVertices[2].x=100;pVertices[2].y=500;pVertices[2].z=0;pVertices[0].rhw=0;pVertices[2].color=0xffffffff;
    	pVertices[3].x=500;pVertices[3].y=500;pVertices[3].z=0;pVertices[0].rhw=0;pVertices[3].color=0xffffffff;
    	pVertices[1].tv=0.0f;
    	pVertices[1].tu=1.0f;
    	pVertices[2].tv=1.0f;
    	pVertices[2].tu=0.0f;
    	pVertices[3].tv=1.0f;
    	pVertices[3].tu=1.0f;
    
        g_pVB->Unlock();
    
    		WORD wIndices[6] = { 
    		0,1,2, 
    		1,2,3 
    		};
    		WORD *pInd;
    
    	if( FAILED( g_pd3dDevice->CreateIndexBuffer(60*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIndex,NULL)))
    		return E_FAIL;
    	if( FAILED(g_pIndex->Lock(0,sizeof(pInd),(void**)&pInd,0)))
    		return E_FAIL;
    	pInd[0]=0;
    	pInd[1]=1;
    	pInd[2]=2;
    	pInd[3]=1;
    	pInd[4]=3;
    	pInd[5]=2;
    	g_pIndex->Unlock();
    
    	D3DXCreateTextureFromFile(g_pd3dDevice,
    								"9.jpg",
    								&g_pTexture);
    	//m1.LoadFromFile("character.txt",g_pd3dDevice);
    
        return S_OK;
    }
    
    VOID Cleanup()
    {
        if( g_pVB != NULL )        
            g_pVB->Release();
    
        if( g_pd3dDevice != NULL ) 
            g_pd3dDevice->Release();
    
        if( g_pD3D != NULL )       
            g_pD3D->Release();
    }
    
    VOID Render()
    {	
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
    
        if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
        {
    
    		D3DXMATRIX matView; 
    		D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ), 
    							&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), 
    							&D3DXVECTOR3( 0.0f, 1.0f, 0.0f )); 
    		g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); 
    		D3DXMATRIX matProj;
    		D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, -10.0f, 100.0f );
    		g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    
    		D3DXMATRIX matWorld;
    		D3DXMatrixRotationY( &matWorld, timeGetTime()/200.0f );
    		g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    
    		g_pd3dDevice->SetTexture( 0, g_pTexture );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_ADDSIGNED );
            g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
            g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
            g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
            g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
    
    		g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    		//g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
    		g_pd3dDevice->SetRenderState(D3DRS_DITHERENABLE, FALSE);
    		g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
    		g_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
    
            g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    		g_pd3dDevice->SetIndices(g_pIndex);
    		g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
            g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    		g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,6);
    
            g_pd3dDevice->EndScene();
        }
    	//m1.Render(g_pd3dDevice);
        if(g_pd3dDevice->Present( NULL, NULL, NULL, NULL )==!D3D_OK)
    	{
    		MessageBox(NULL,"Present Failed","",MB_OK);
    	}
    
    }
    
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
            case WM_DESTROY:
                Cleanup();
                PostQuitMessage( 0 );
                return 0;
        }
    
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    {
    
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                          "D3D Tutorial", NULL };
        RegisterClassEx( &wc );
    
        hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 02: Vertices",
                                  WS_OVERLAPPEDWINDOW, 0, 0, 1024, 750,
                                  GetDesktopWindow(), NULL, wc.hInstance, NULL );
    
        if( SUCCEEDED( InitD3D( hWnd ) ) )
        {
            if( SUCCEEDED( InitVB() ) )
            {
                ShowWindow( hWnd, SW_SHOWDEFAULT );
                UpdateWindow( hWnd );
    
                MSG msg;
                ZeroMemory( &msg, sizeof(msg) );
                while( msg.message!=WM_QUIT )
                {
                    if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                    {
                        TranslateMessage( &msg );
                        DispatchMessage( &msg );
                    }
                    else
                        Render();
                }
            }
        }
    
        UnregisterClass( "D3D Tutorial", wc.hInstance );
        return 0;
    }
    


  • Hat sich geklärt.


Anmelden zum Antworten