Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.09.2012, 21:07

D3DLOCKED_RECT ist leer

Hallo.
Ich habe ein Problem, bei dem ich warscheinlich die Ursache gefunden habe. Ich möchte auf meinem Surface einzelne Pixel anmalen, dazu muss ich aber das Surface "locken". Allerdings ist die Variable, die den "gelockten" Surface enthält leer und ich weiß nicht warum und wie ich das lösen kann.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CStarfield::Draw(LPDIRECT3DSURFACE9 lpSurface){
    D3DLOCKED_RECT LockedRect; //Leer

    lpSurface->LockRect(&LockedRect, NULL, 0);

    int Pitch = LockedRect.Pitch / 4;
    
    D3DCOLOR* Pixels = reinterpret_cast<D3DCOLOR*>(LockedRect.pBits);

    for(int i=0; i<m_starCount; i++){
        m_Stars[i].Draw(Pixels, Pitch);
        m_Stars[i].Move();
    }

    lpSurface->UnlockRect();
}


Ich habe herausgefunden, dass es leer ist, weil Pixels ein Null-Pointer ist und Pitch auch 0 ist. lpSurface ist nicht leer.
Hoffe jemand kann mir Helfen.

MfG
MazzMan
Hi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.09.2012, 21:33

Was sagt die Debug Runtime? Was genau für eine Surface ist das?

3

24.09.2012, 21:46

Das ist ein Backbuffer.
Wenn ich das Programm ausführe kommt diese Meldung:

Zitat

Unbehandelte Ausnahme bei 0x00ee2aed in blabla.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000a4.
Ich habe das nun zurückverfolgt und bin darauf gekommen, dass etwas beim Anlegen von "LockedRect" schief gelaufen ist.
Hi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

24.09.2012, 21:51

Ich meinte, was die Direct3D 9 Debug Runtime dir sagt, nicht was der Debugger sagt. ;)
Du kannst nicht einfach so jede beliebige Surface locken. Hast du deinen BackBuffer lockable gemacht!? (D3DPRESENTFLAG_LOCKABLE_BACKBUFFER)

5

24.09.2012, 21:55

Wie kann ich die Direct3D 9 Debug Runtime öffnen?
Hi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.09.2012, 22:01

Im DirectX Control Panel einschalten: http://legalizeadulthood.wordpress.com/2…-debug-runtime/
Dann liefert Direct3D dir wertvolle Debug Informationen ins Output Window...

Abgesehen davon, könnte dich das auch interessieren: http://msdn.microsoft.com/en-us/library/…p/bb173355.aspx

7

25.09.2012, 16:14

Zitat

Direct3D9: (ERROR) :RenderTargets are not lockable unless application specifies TRUE for the Lockable parameter at CreateRenderTarget or D3DPRESENTFLAG_LOCKABLE_BACKBUFFER at CreateDevice, CreateAdditionalSwapChain or Reset. Lockable render targets incur a performance cost on some graphics hardware.

Ohh. Ja danke. Ich muss mein Surface erst lockable machen.
Hi

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »MazzMan« (25.09.2012, 17:17)


Werbeanzeige