Mesh wird nicht richtig angezeigt



  • Hab den Code etwas abgeändert:

    void CMesh::Load( LPSTR file )
    {
    	LPD3DXBUFFER	pBufMaterials;
    	D3DXMATERIAL*	pTempMaterials;
    
    	if( FAILED( D3DXLoadMeshFromX( file,
    								   D3DXMESH_SYSTEMMEM,
    								   CGraphics::GetD3DDevice(),
    								   NULL,
    								   &pBufMaterials,
    								   NULL,
    								   &m_numMaterials,
    								   &m_pMesh ) ) )
    	{
    		MessageBox( NULL, "Mesh wird nicht geladen.", "Fehler", NULL );
    	}
    
    	pTempMaterials = (D3DXMATERIAL*)pBufMaterials->GetBufferPointer();
    
    	m_pMaterials = new D3DMATERIAL9[m_numMaterials];
    	m_ppTextures = new LPDIRECT3DTEXTURE9[m_numMaterials];
    
    	for( unsigned long i = 0; i < m_numMaterials; i++ )
    	{
    		m_pMaterials[i] = pTempMaterials[i].MatD3D;
    		m_pMaterials[i].Ambient = m_pMaterials[i].Diffuse;
    
            // geändert
    	if( FAILED( D3DXCreateTextureFromFile( CGraphics::GetD3DDevice(),
    											   pTempMaterials[i].pTextureFilename,
    											   &m_ppTextures[i] ) ) )
    		{
    			m_ppTextures[i] = NULL;
    		}
    	}
    
    	pBufMaterials->Release();
    }
    
    void CMesh::Draw()
    {
    	CGraphics::GetD3DDevice()->SetTransform( D3DTS_WORLD, &m_matWorld );
    	CGraphics::GetD3DDevice()->SetRenderState( D3DRS_LIGHTING, FALSE );
    
    	for( unsigned long i = 0; i < m_numMaterials; i++ )
    	{
    		CGraphics::GetD3DDevice()->SetMaterial( &m_pMaterials[i] );
                    // geändert		
                    if( m_ppTextures[i] != NULL )
    		{
    			CGraphics::GetD3DDevice()->SetTexture( 0, m_ppTextures[i] );
    		}
    		m_pMesh->DrawSubset( i );
    	}
    }
    

    Jetzt bekomme ich keine Fehlermeldung mehr aber das Mesh wird wieder weiß angezeigt.



  • guck mal beim Debuggen ob die Texturen auch wirklich geladen werden. Vielleicht wird die Datei nicht gefunden oder der Dateiname ist nicht gültig.



  • Die Texturen werden tatsächlich nicht geladen. Kriege immer eine Fehlermeldung:

    if( FAILED( D3DXCreateTextureFromFile( CGraphics::GetD3DDevice(),
    											   pTempMaterials[i].pTextureFilename,
    											   &m_ppTextures[i] ) ) )
    		{
    			MessageBox( NULL, "CMesh::Load( LPSTR file ): D3DXCreateTextureFromFile() fehlgeschlagen.", "Fehler", NULL );
    			m_ppTextures[i] = NULL;
    		}
    


  • nnjo. dann würde ich an deiner Stelle dafür sorgen, dass sie geladen werden 🙂

    überprüfe den dateinamen zur Laufzeit und guck ob die texturdateien sich auch wirklich da befinden wo sie sich befinden sollen



  • Wo genau müssen sich denn die Dateien befinden? Habe die .x-Datei und die .bmp-Dateien in das Verzeichnis gepackt, das ich bei D3DXLoadMeshFromX() angegeben habe. Wie überprüfe ich den Dateinamen zur Laufzeit?



  • Setz einen Breakpoint vor das Laden der Textur, drück auf debuggen (da ich nicht weiß welche IDE/welchen Compiler du verwendest weiß ich nicht wie du das debuggen genau startest) und füg den Ausdruck "pTempMaterials[i].pTextureFilename" zu den Watches hinzu. Damit solltest du sehen den Dateinamen inklusive realtiven Pfad sehen. Der Pfad ist relativ zu dem Verzeichnis in welchem das Programm ausgeführt wird.



  • Wenn ich einen Breakpoint setzte und dann bei pTempMaterials[i].pTextureFilename nachgucke steht da: pTextureFilename = 0x00000000 <Schlechtes Ptr>.



  • Jetzt weiß ich leider auch nicht weiter. Schau ob die Materials überhaupt stimmen..
    Mit .x meshes hab ich nie was gemacht. aber vllt könnte google mit funktionierenden Beispielen helfen? 🙂



  • ich hatte auc hmal ne frage dazu bei mir kommt eine fehler meldung :

    das Diffuse kein Member von D3DMATERIAL sei 😞

    m_pMaterials[i].Ambient = m_pMaterials[i].Diffuse;



  • Also ich zumindest weißt nicht, wie ich Dir so bei diesem Problem helfen könnte. Hast Du mal den Code und die Fehlermeldung mit Hinweis auf die Zeile?
    Oder Du hast Glück, und jemand anderer weiß es auch so 😃


Anmelden zum Antworten