Backbuffer Locken ?



  • Hallo,
    ich habe gerade angefangen mir mit DirectX9 eine kleine 2D Engine zu basteln. Bin mir garnicht sicher, ob man das schon ne Engine nennen kann, eigentlich wrappe/kapsele ich nur die DX Funktionen, in meine eigenen Funktionen. Nun bin ich gerade bei der Funktion, zum ändern von Pixeln auf dem Bildschirm angelangt. Um einen Pixel zu ändern, muss ja zuersteinmal ein Surface gelocked werden. Da man den Backbuffer leider nicht locken kann, muss daher ein neues Surface erstellt werden. Wenn ich jetzt jedoch ein Surface der größe 40*40 erstelle, um darauf dann eine Linie zu zeichnen, und dieses Surface dann auf den Backbuffer kopiere (StretchRect), wird ja nicht nur die Linie sondern das gesammte Surface kopiert. Dadurch wird eine Fläche von 40*40 Pixel auf dem Backbuffer überschrieben. Ich will jedoch, dass nur das was von der Linie überdeckt wird, überschrieben wird. Wie kann ich das nun elegant machen ? Gibt es eine Möglichkeit direkt auf den Backbuffer zu zeichnen, oder nur die Linie zu kopieren ?

    Ich weiß, die Frage ist dumm, aber ich hänge nun schon bald ne Woche an dem Problem rum, und bin kurz vorm verzweifeln.

    thx for help
    cu



  • Ich hoffe, du nimmst nicht DirectDraw. Falls ja, hör damit einfach wieder auf. 😞
    Falls du wirklich DX9 benutzt, was DirectDraw ausschließt, denn das gibt es nur bis Version 7, dann schau dir doch mal in der MSDN das ID3DXLine Interface an, oder so ähnlich.



  • Oder du malst einfach ein schmales Rechteck.

    Bye, TGGC (Der Held ist zurück)



  • hab mir das mal in der dx doc angeschaut. Da steht was von Begin und End und sowas, aber ich raff das net. Wäre nett wenn jemand mal n kurzen beispielcode posten könnte. Ich weiß nämlich garnichts mit diesem ID3DXLine interface anzufangen, wie benutze ich das ?

    thx for help



  • Es funktioniert auch ohne begin und end. Und wenn du das mal irgendwann besser raffst, kannst du es damit optimizen 😉

    Das Line-Interface hab ich noch nicht verwendet, also kann ich dir dazu keinen Beispielcode geben.



  • Bevor ich da irgendwas optimiere, muss ich es erstmal normal schaffen, eine Linie auf den Bildschirm zu Zeichnen 😡 . Was ich jedoch bisjetzt noch nichts hinbekommen habe. ID3DXLine ist doch eine Klasse, jedoch eine abstrakte basisklasse, daher kann ich kein objekt davon erstellen. Aber wie kann ich dann das ID3DXLine::Draw benutzen 😕 Also, wenn jemand hier, mal den Code zum malen der Linie posten könnte, fände ich das 👍



  • Seed schrieb:

    ID3DXLine ist doch eine Klasse, jedoch eine abstrakte basisklasse, daher kann ich kein objekt davon erstellen.

    du brauchst auch kein objekt ein pointer reicht. 😮

    Seed schrieb:

    Aber wie kann ich dann das ID3DXLine::Draw benutzen 😕 Also, wenn jemand hier, mal den Code zum malen der Linie posten könnte, fände ich das 👍

    ID3DXLine* line;
    ....
    // fehler abfrage nicht vergessen
    D3DXCreateLine(MEINDEVICE,&line);
    ....
    // bei render
    D3DXVECTOR2 pos[2];
    pos[0].x = -10.0f;
    pos[0].y = -10.0f;
    pos[1].x =  20.0f;
    pos[1].y =  20.0f;
    
    line->Begin();
    line->Draw(pos, 2, 0);
    line->End();
    


  • Frage: wieso kann man den back buffer nicht locken?? man muss nur bei CreateDevice als Flags D3DLOCKABLE_BACKBUFFER oder so übergeben. oder geht das in DX9 nicht mehr?



  • Doch. Aber die GDI kannst du AFAIK trotzdem nicht nutzen. Also wenn du dir das rumwurschteln mit dem Grafikspeicher ersparen willst, dann lass es lieber.
    Außerdem denke ich mal, dass die Performance ein _bisschen_ in den Keller geht, wenn du jedesmal lockst, anstatt das hardwarebeschleunigte Interface zu verwenden.



  • Ich behaupte einfach mal, die geht schon in den Keller, wenn du nur einmal lockst. 😉

    Bye, TGGC (Der Held ist zurück)



  • Ich habe jetzt ein unlock impliziert. 😉


Anmelden zum Antworten