LockedRect.pBits Error bei 9200x2999



  • Ich will von jedem Pixel eines Bildes auslesen ob der Pixel transparent ist oder nicht. Das ganze klappt auch soweit bis zu dem Pixel 9200x2999. Bei dem Pixel erscheint eine Zugriffsverletzung. Wenn das Bild kleiner als 9200x2999 ist gibt es keine Probleme. Und wenn das Bild größer ist und ich den Pixel überspring funktioniert auch alles, aber irgendwie klappt das ganze dann trotzdem nicht.

    Der Code:

    D3DLOCKED_RECT LockedRect;
    			SpriteTexture->LockRect(0, &LockedRect, NULL, D3DLOCK_READONLY);
    
    			DWORD* pPixels = (DWORD*)LockedRect.pBits;
    
    			LockedRect.Pitch /= 4;
    
    			transparent.clear();
    
    			for (int i = 0; i < h; i++)
    			{
    				for (int j = 0; j < w; j++)
    				{
    					bool transparenz = !(((pPixels[i*LockedRect.Pitch + j]>>24) & 0xff) > 0);
    					transparent.push_back(transparenz);
    				}
    			}
    
    			SpriteTexture->UnlockRect(0);
    


  • Ich hab auch keinen Plan warum das passieren könnte. Sollte IMO nicht, wenn dann sollte der LockRect() Aufruf gleich fehlschlagen (BTW: prüfst du wirklich den Returnwert NICHT? Das solltest du nämlich...)

    Aber gib vielleicht mal LockedRect.Pitch aus (TRACE, ...), wäre interessant was sich aus LockedRect.Pitch * 2999 ergibt.

    Und was du noch probieren könntest wäre die Textur Stückweise zu locken. Also z.B. in Quadraten von 512x512 Pixeln, oder in Streifen oder sowas.
    Vielleicht hat der Grafikkartentreiber einfach nur einen Bug bzw. ein Limit (welches man u.U. abfragen könnte, was du aber vermutlich nicht tust ;)) und kommt mit so grossen Locks nicht klar.


  • Mod

    direct3d im debug gibt keine errors oder warnings aus?



  • Danke erstmal für die schnellen Antworten!

    prüfst du wirklich den Returnwert NICHT? Das solltest du nämlich...

    Jetzt schon 😉 Aber da kommt kein Error. Immoment schreib ich meinen Code zwar übersichtlich aber noch ohne viele Fehler abzufangen und solche Sachen. 🙄

    Aber gib vielleicht mal LockedRect.Pitch aus (TRACE, ...), wäre interessant was sich aus LockedRect.Pitch * 2999 ergibt.

    Pitch: 8192 Höhe*Pitch = 24567808
    Ich bin gespannt wie mir das helfen kann.

    Und was du noch probieren könntest wäre die Textur Stückweise zu locken. Also z.B. in Quadraten von 512x512 Pixeln, oder in Streifen oder sowas.

    Hab das ganze jetzt mal mit Streifen von 11400x100 und 5700x100 versucht aber der bleibt immernoch an 9200x2999 hängen. Bei Quadraten wusste ich jetzt nicht was das bringen soll außer, dass ich danach noch kompliziert die Daten in die Liste einsortieren muss. Bei anderen nicht quadratischen Texturen die kleiner sind funktioniert ja alles.

    Vielleicht hat der Grafikkartentreiber einfach nur einen Bug bzw. ein Limit (welches man u.U. abfragen könnte, was du aber vermutlich nicht tust ;)) und kommt mit so grossen Locks nicht klar.

    Oha woher wusstest du das nur? 😮 😃 Meine Grafikkarte ist eigentlich eine der neusten aber wie kann man sowas denn prüfen oder nachlesen? Die Felder über diesem Pixel funktionieren ja wieder.

    Wenn ich die Höhe mit der Breite vertausche kommen diese Werte beim Fehler:
    1008x8192 Pitch: 3000

    direct3d im debug gibt keine errors oder warnings aus?

    Bei mir nicht. Also ich benutz das normale Debugging von MSVS, ich weiß nicht ob es da noch was spezielles für Direct3D gibt.



  • Nach weiterem herumprobieren hab ich festgestellt, dass wenn ich den Pixel mit einer if Bedingung umgehe die Felder danach wieder die Pixelwerte der linken Seite haben, das Bild sogesehen beim Lock ab diesem Pixel wieder von vorne beginnt. Ich hab dann auch mal andere Größen vor die Textur genommen und immer einen Pitch Wert von 32768 erhalten, wenn das Bild eine bestimmte Größe überschritten hat.
    Hat irgendwer eine Idee warum das so ist oder was ich versuchen könnte um das zu umgehen?

    PS: Auf einem anderen Computer mit einer anderen Grafikkarte funktioniert es auch nicht.


  • Mod

    SirHans schrieb:

    direct3d im debug gibt keine errors oder warnings aus?

    Bei mir nicht. Also ich benutz das normale Debugging von MSVS, ich weiß nicht ob es da noch was spezielles für Direct3D gibt.

    es gibt nur einen weg wie du dieses wissen erlangen kannst um dein problem vermutlich in 5min zu loesen...



  • Scheint so als würde der Error kommen weil die Textur breiter als die maximale Breite ist und deshalb irgendetwas bei LockRect schiefläuft. Da bleibt mir wohl nichts anderes als das Bild in mehrere Teile aufzuteilen.
    Wenn irgendjemand noch eine bessere Idee hat bin ich natürlich für alles offen 😉


Anmelden zum Antworten