Zugriff auf Oberfläche. Falscher Pointer?



  • Hallo

    Ich möchte direkt auf die einzelnen Pixel einer Oberfläche zeichnen. Dazu habe ich eine Methode Draw, welcher die Oberfläche übergeben wird. Dies geschieht über folgende Zeile:

    Object.Draw(Direct3D.GetBackBuffer());
    

    Hier die Methode GetBackBuffer() :

    LPDIRECT3DSURFACE9 CD3D::GetBackBuffer()
    {
    	m_lpD3DDevice->GetBackBuffer(
    								0,0,
    								D3DBACKBUFFER_TYPE_MONO,
    								&m_lpBackBuffer);
    	return m_lpBackBuffer;
    }
    

    Die Methode Draw macht folgendes:

    void CObject::Draw(LPDIRECT3DSURFACE9 lpSurface)
    {
    	D3DLOCKED_RECT LockedRect;
    	lpSurface->LockRect(&LockedRect, NULL, 0);
    
    	int Pitch = LockedRect.Pitch / 4;
    
    	D3DCOLOR *pPixels = (D3DCOLOR*)LockedRect.pBits;
    
    	for(int i = 0; i<m_NumberOfElements; i++)
    	{
    		m_Element[i].Draw(pPixels, Pitch);
    		m_Element[i].Move();
    	}
    
    	lpSurface->UnlockRect();
    }
    

    Die Methode getBackBuffer() gibt mir die Speicheradresse der Oberfläche an (0x004014e0). Das scheint also zu klappen (obs wirklich die Richtige Adresse ist sei dahingestellt). Ich Arbeite also mit diesem Wert weiter.

    In der Methode Draw() welcher die Adresse übergeben wird erscheint mir im Debugmodus aber plötzlich die Adresse 0x00160920 😮 😕
    Leider erzeugt mir dann der Aufruf lpSurface->LockRect(&LockedRect, NULL, 0); auch nichts gültiges...
    LockedRect hat dann die Werte Pitch = 0 und auch der Zeiger pBits ist ungültig (0x00000000)

    Was läuft hier falsch? Meiner Meinung nach hat hier lpSurface eine falsche Adresse! Warum?

    Lösungsvorschläge?

    Gruss
    GB



  • Die Methode getBackBuffer() gibt mir die Speicheradresse der Oberfläche an (0x004014e0).
    Das scheint also zu klappen

    Warum guckst Du nicht mal in den Returncode von IDirect3DDevice9::GetBackBuffer ?


Anmelden zum Antworten