LockRect -> invalid call
-
um einzelne pixel zu adressieren ist es notwendig das entsprechende byte in der zeile zu ermitteln, da muss ich den pitch früher oder später teilen.
-
Nein musst du nicht. Einzelne Pixel adressierst du mit x und y Koordinaten. Die y Koordinate entspricht der Zeile. y * Pitch gibt dir damit den Byteoffset von pBits zum Zeilenanfang. Und von dort gehst du dann x * sizeof(Pixel) (in deinem Fall also x DWORDs) weiter um zu deinem Pixel zu gelangen. An deiner Stelle würd ich sowieso mal diese ganze komische Indexberechnung da überprüfen, höchstwahrscheinlich liegt der Fehler eh dort. Check mal ob das was du da ausrechnest überhaupt noch in der Surface drinnen liegt...
-
OK. Das sind echt solide Informationen^^ danke, hab mich eh die ganze zeit gefragt, warum das im buch so steht. Probier das mal sofort aus.
-
Hmm, schade, aber gibt genau den gleichen fehler aus. Meine Indexbrechnung:
int index = ((int)m_y * Pitch + (int)(m_x * 4));
Der Pitch geht dabei unverändert in die Berechnung ein. m_y ist die y koordinate des Sterns, m_x entsprechend die x-Koordinate. /4, weil sizeof(D3DCOLOR_X8R8G8B8) letztenendes auch nur 4 rausschmeißt.
-
Der Unterschied zwischen einem Index und einer Adresse ist dir bekannt!? Was ich meinte war folgendes:
DWORD* pixel = reinterpret_cast<DWORD*>(static_cast<char*>(LockedRect.pBits) + y * LockedRect.Pitch) + x;
-
ja, der unterschied ist mir bekannt...
Ich habe einen index berechnet, um via pBits[index] eine Adresse zu erhalten. pBits ist ein Zeiger auf das erste Byte der Surface und man kann diesen auch als array von Bytes behandeln. Demnach muss man nur berechnen, das wievielte Byte ich veränder/setzen möchte und dieses via pBits[Index] ansprechen.
-
Stimmt, sry hab deinen Code zu flüchtig gelesen
-
Macht ja nix. Ich hätte wohl auch keinen Bock richtig hin zu lesen, wenn ich den mist schon 100 mal gemacht hätte
Ich gehe jetzt mal davon aus, das die Adressierung des Pixels klappt, dann gibt es immer noch den blöden Fehler. Ergo gibt es entweder eine Möglichkeit die Zugriffsrechte zu beeinflussen oder der Surface ist eben doch nicht richtig gelockt, obwohl kein Fehler ausgegeben wird.
Natürlich gibt es auch noch Option3, dass Directx auf dem Gebiet Veränderungen durchlaufen hat, die dem Buch selbstredend vorenthalten sind, da es zu directx9 Zeiten geschrieben wurde.
-
Ich würde zuerst mal Option 4 überprüfen: Du greifst auf Speicher zu der außerhalb der Surface liegt weil deine Koordinaten müll sind.
-
hm.
ich kann nur sagen: wenn ich von LockRect() "success" bekommen habe, dann hat's bei mir auch immer funktioniert.
probleme hatte ich nur manchmal dass ich überhaupt "success" von LockRect() zurückbekomme - einige kombinationen aus surface-flags und pixel-format wollten da einfach nicht mitmachen.
soll heissen: untersuch wirklich mal "option 4"
-
Ok. Hab es hinbekommen. Die Koordinaten waren ok, allerdings haben die vergessen abzufragen, ob die Koordinate, welche ich zeichnen möchte auf dem Surface liegt. hab das zusätzlich abgefragt und jetzt läuft es. Danke für eure hilfe Dot und Hustbaer.
so long
euer Shane
-
Also waren die Koordinaten Müll :p
Anyway, am Besten du vergisst das alles jetzt ganz schnell wieder und renderst deine Sterne als Pointlist
-
In der Tat^^ einiger der Koordinaten waren sehr crapy. Umso enttäuschender, das das aus nem eigentlich angesehenen Buch stammt.