Laden...

Wie zeichne ich 2d mit direct3d

Erstellt von Floste vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.042 Views
Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 16 Jahren
Wie zeichne ich 2d mit direct3d

Ich möcht gerne ein paar Bilder gedreht,skaliert und zugeschnitten mit Alphablending übereinander zeichnen (2d). Das Ganze soll möglichst schnell gehen, daher wollte ich das mit DirectX machen. Bei DirectDraw stand in den Kommentaren, dass man es nichtmehr verwenden soll.

fragen sich "Wo ist DirectDraw für meine Spiele in 2D?".
Nun, bei DirectX 8 gibt es die Komponente DirectDraw nicht mehr. Sie wurde von Microsoft unter dem Begriff DirectGraphics mit Direct3D zusammengefasst und in die Komponente Direct3D verschoben.

Deshalb wollte ich das mit Direct3d machen. Mehr, als ein Device zu erstellen und es schwarz zu füllen, hab ich aber nicht hinbekommen.

Mit anderen Worten: Ich hab 0Plan von Direct3d.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

S
506 Beiträge seit 2006
vor 16 Jahren

schau dir mal "Sprites" an.

Und was willst du denn machen, was schnell gehen soll? Die GDI+ ist zwar langsamer, dennoch kann man mit ihr viel machen.

P
70 Beiträge seit 2006
vor 16 Jahren

Das klingt irgendwie so nach Bildverarbeitung, da würde ich dann dir vielleicht hierauf einen Blick empfehlen:

GetPixel und SetPixel um Längen geschlagen. 800 mal schneller

Ansonsten wenn du in C# codest wäre evtl. XNA für dich interessant.

Grüße

plucked

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 16 Jahren
Noch ne andere Frage

Der Tip mit den Sprites hat mir sehr geholfen.

Ich hab jetzt aber noch 2 andere Probleme:

Wie finde ich möglichst prozessorschonend heraus, ob eine Strecke, von der ich die Endpunkte habe, ein Rchteck schneidet?

Wenn ich ein Device auf dem Fenster hab, und es minimire, bekomme ich nen Fehler, angeblich in application.Run(Form) liegt. Wie kann ich das vermeiden?

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

148 Beiträge seit 2006
vor 16 Jahren

Wie finde ich möglichst prozessorschonend heraus, ob eine Strecke, von der ich die Endpunkte habe, ein Rchteck schneidet?

ich hätte mal zwei Vorschläge..

Vorschlag 1:

die Schnittpunkte sind doch relativ einfach zu berechnen.. du kannst dir anhand der Endpunkte der Strecke die Geradengleichung herleiten.. und dein Rechteck besteht letztendlich auch aus vier Geraden, deren Geradengleichung eine recht einfache Form haben (entweder x= ... oder y= ...) jetzt setzt du deine Geradengleichung der Strecke der Reihe nach mit den Gleichungen des Rechtecks gleich und schon erhälst du eventuelle Schnittpunkte.. kannst ja schon bei dem ersten Auftauchen eines Schnittpunkts abbrechen..

Vorschlag 2:

sieh deine Strecke als ein Rectangle mit der Länge deiner Strecke und der Breite 1 (1 Pixel). Dann erstellst ein Rectangle (das Rechteck, bei dem die Schnittpunkte überprüft werden sollen). Dann gibt es in der Rectangle-Klasse eine Methode Intersect oder IntersectsWith, der übergibst das Rechteck, welches deine Strecke symbolisiert und tadaaa kriegste die Schnittmenge 😁 sollte eigentlich so auch funktionieren..

falls was falsch ist, bitte korrigieren 🤔

greetz..

I cna tpye 300 wrods pre mnuite!

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 16 Jahren
Nochmehr Probleme

Ich hab jetzt aus den Endpunkten ein Rectangle erstellt und benutze IntersectsWith.
(also bloß ne Heuristik)

Ich möchte jetzt aber ne Textur aus ner Bitmap erstellen (mit Texture.fromBitmap).
Wenn ein neues Objekt erstellt wird, wird die gezeichnet, was auch funktioniert.

Die Textur ist auf dem Bildschirm aber nur ein weißer Block.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

148 Beiträge seit 2006
vor 16 Jahren

Hallo Floste..

Ich hab jetzt aus den Endpunkten ein Rectangle erstellt und benutze IntersectsWith.
(also bloß ne Heuristik)

wie meinst du das? So wie ich das so verstehe, könnte es nämlich falsch sein..
du hast eine Diagonale von (0,0) nach (30, 30) .. wenn du das rechteck an den Ecken aufspannst hättest du ein Rechteck mit Breite und Länge 30.. jetzt kann aber ein anderes Rechteck dieses Rechteck schneiden, ohne jemals die Linie zu berühren.. du würdest schnittpunkte zurückliefern die schlichtweg falsch sind.. aber vielleicht hab ich dich ja auch nur falsch verstanden..
ich muss dazu auch korrigieren: das geht glaube ich auch nur, wenn deine linie waagerecht oder senkrecht ist.. zumindest habe ich damals diese variante verworfen und fand die andere praktischer..

Die Textur ist auf dem Bildschirm aber nur ein weißer Block.

du musst schon ein paar zeilen code zeigen, wo und wie du die textur draufmappst, sonst ist nur schwer zu erahnen wo der fehler liegt 🙂

greetz..

I cna tpye 300 wrods pre mnuite!

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 16 Jahren

Wie ich das meinte: Heuristik (Wikipedia) 😁

Die Textur ist auf dem Bildschirm aber nur ein weißer Block:
Das lag daran, dass ich

texture = Microsoft.DirectX.Direct3D.Texture.FromBitmap(parent.Painting, bgg,0 , Pool.SystemMemory)
genommen hatte.

texture = Microsoft.DirectX.Direct3D.Texture.FromBitmap(parent.Painting, bgg,0 , Pool.Managed)
Funktioniert komischerweise. 🤔

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

5.658 Beiträge seit 2006
vor 16 Jahren

Pool.Managed würde ich auf jeden Fall empfehlen. Wegen der Performance gegenüber den Objekten im SystemMemory und weil sich DirectX dann darum kümmert, wo und wann die Resourcen erstellt bzw. wieder zerstört werden.

// Edit:
...was allerdings nicht erklärt, warum die Textur einfach nur weiß ist. Manchmal legt DirectX schon ein merkwürdiges Verhalten an den Tag.

Weeks of programming can save you hours of planning

Floste Themenstarter:in
1.130 Beiträge seit 2007
vor 16 Jahren

Ein Problem ist allerdings immernoch ungelöst:

Wenn ich ein Device auf dem Fenster hab, und es minimire, bekomme ich nen Fehler, angeblich in application.Run(Form) liegt. Wie kann ich das vermeiden?

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

5.658 Beiträge seit 2006
vor 16 Jahren

Der Fehler wird meines Erachtens von der Device.Present()-Funktion ausgelöst, wenn das Fenster nicht angezeigt wird. U.a. auch, wenn du Strg-Alt-Entf drückst und das Desktop ausgeblendet wird. Das Device löst eine DeviceLost Exception aus oder sowas.
Ich hab das bisher immer unterdrückt, indem ich eine try/catch Anweisung eingefügt hab, aber man sollte sich darum kümmern.

Es gibt ein Ereignis Device.LostDevice, welches in dem Fall aufgerufen wird, und die Anwendung darüber informiert. Wie man damit umzugehen hat, steht in diversen Tutorials im Internet. Ich hab es bisher wie gesagt noch nicht geschafft, mich darum zu kümmern, von daher wäre es nett, wenn du deine Lösung hier posten könntest.

Schöne Grüße,
Christian

Weeks of programming can save you hours of planning