Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DirectX] Textur flippen (https://www.delphipraxis.net/113912-%5Bdirectx%5D-textur-flippen.html)

.chicken 16. Mai 2008 15:45


[DirectX] Textur flippen
 
So, direkt noch ne Frage zu DirectX. Google konnte mir leider nicht helfen. Ich möchte meine Textur gerne flippen, dh. zB. horizontal oder vertikal gespiegelt darstellen.
Allerdings zeige ich oft nur bestimmte Ausschnitte der Textur als einzelne Frames an, d.h. es soll auch Möglich sein den aktuellen Frame zu spiegeln.

Sinn des ganzen soll sein, dass wenn eine Figur über den Bildschirm läuft und die Richtung ändert, dass ich dann zur richtigen Darstellung das Bild nicht gespiegelt speichern muss.

Was gibt es da für Möglichkeiten? Bisher habe ich nichts hinbekommen, das funktioniert hat.

JasonDX 16. Mai 2008 15:55

Re: [DirectX] Textur flippen
 
Du kannst entweder die Welt-Matrix entsprechend anpassen (Rotation), oder die Texturkoordinaten negieren. Beides sollte den gewünschten Effekt erzielen.

greetz
Mike

.chicken 16. Mai 2008 16:32

Re: [DirectX] Textur flippen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hm das funktioniert nur bedingt. Also gespiegelt wird es zwar, aber meine Textur ist animiert, d.h. sie spielt nacheinander Frames (teile der Textur) ab. Wenn ich das jetzt spiegele, dann wird zwischendurch das Bild immer transparent. Vermutlich liegt das daran, das mein FrameSet "leere Plätze" aufweist (siehe Anhang).
Es werden in dem FrameSet nun nacheinander die Texturkoordinaten so transformiert, dass nacheinander alle Frames angezeigt werden.

Klappt super. Nur wenn ich jetzt spiegele, dann scheint er die Frames nichtmehr richtig zu berechnen:
Delphi-Quellcode:
  Scale(1 / ColCount, 1 / RowCount);
  _X := 1 / ColCount * (_Frame mod ColCount);                           //X-Koordinate des Frames
  _Y := 1 / RowCount * ((_Frame - (_Frame mod ColCount)) div ColCount); //Y-Koordinate des Frames
  Move(Get2DXVector2(_X, _Y));
Hier werden die Texturkoordinaten einfach entsprechend transformiert und das scheint mit der Reflektion nicht zu funktionieren.
Row und ColCount = Anzahl Reihen und Spalten im FrameSet
_Frame gibt den aktuellen Frame an.
Move und Scale sind einfach Methoden die die D3DDevice Funktionen zum Transformieren kapseln.

Hier klappt irgendwas nicht richtig. Hoffe das nun gut erklären gekonnt zu haben :D

JasonDX 16. Mai 2008 16:43

Re: [DirectX] Textur flippen
 
Bei der Variante für die Texturkoordinaten hatte ich vergessen zu erwähnen: Du musst den SamplerState auf Mirror stellen. Sry, lag ich falsch; Clamp, also die Standard-Einstellung passt... Über die reine D3D-API geht über die MSDN-Library durchsuchenSetSamplerState-Funktion:
Code:
Device->SetSamplerState(0 /*evt. anzupassen*/, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
Damit brauchst du zum Spiegeln lediglich die x/y-Koordinate (je nach dem, an welcher Achse du spiegeln willst) negieren.

greetz
Mike

.chicken 16. Mai 2008 17:20

Re: [DirectX] Textur flippen
 
Ok, also es klappt einfach nicht. Er spiegelt es, nur ich kriege dann die Berechnung für die Frames nichtmehr hin.
Oben habe ich ja geschrieben wie ich die Frames berechne, hat irgendwer ne Idee wie ich das mit der Reflektion mache?
Ich krich es einfach nicht hin :wall:

Ich erklär nochmal kurz wie ich bisher berechne:
Meine Texturkoordinaten sind zB
(0/0) (1/0)
(0/1) (1/1)
für ein simples Rechteck.
Jetzt multipliziere ich diese Koordinaten mit 1 / Spaltenzahl.
Bei 4Spalten z.B. mit 0.25.

Danach berechne ich, in welcher Spalte und Reihe sich der(?)die(?)das(?) aktuelle Frame befindet:
Delphi-Quellcode:
Frame mod Spaltenzahl //aktuelle Spalte
Frame / Spaltenzahl ohne den Teil hinter dem Komma //aktuelle Zeile
Dann akt.Spalte * Spaltenbreite(1/Spaltenzahl) und das selbe mit den Reihen.

So berechne ich das. Hoffe das war verständlich. Wird das ganze nun gespiegelt, funktioniert das aber antürlich nichtmehr. Ich finde einfach keine Möglichkeit für eine simple Berechnung nach der Spiegelung.

JasonDX 16. Mai 2008 18:08

Re: [DirectX] Textur flippen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie du die Texturkoordinaten selbst berechnest spielt keine Rolle. Die, die du zuletzt verwendest sind wichtig.
Nehmen wir als Beispiel deine Figur, und beschränken uns da auf die Spiegelung um die y-Achse.
Ganz oben sehen wir mehrere Bilder, und wir wollen jetzt bspw. das 3. Dann berechnest du die Texturkoordinaten (0.5, y1), (0.75, y1), (0.5, y2), (0.75, y2). Diese ergeben dann den darunter abgebildeten Ausschnitt. Wir wollen den aber gespiegelt. Wie machen wir das? Wir negieren die Texturkoordinaten. Da wir nur um die y-Achse spiegeln wollen, negieren wir nur die x-Werte. Also haben wir neue Texturkoordinaten: (-0.5, y1), (-0.75, y1), (-0.5, y2), (-0.75, y2).
Die oberen beiden sind auf dem Bild aufgezeichnet.
Da die schwarze "Ecke" des Frames auf den linken Vertex, und die blaue Ecke auf den rechten Vertex "geklebt" wird, erscheint das Frame nun gespiegelt.

greetz
Mike

.chicken 16. Mai 2008 20:39

Re: [DirectX] Textur flippen
 
Ja, soweit verstehe ich das schon. Aber die Umsetzung sieht leider nicht so einfach aus.
Denn das Frame, dass du mit deiner Methode durch die Reflektion erhälst, ist nicht dasselbe wie vorher. Das ist es nur, wenn ich den AddressMode "Mirror" einstelle.
Dann werden die Bilder aber doppelt gespiegelt -> keine Spiegelung:
Einmal durch den von dir gezeigten Effekt und durch den Effekt durch "Mirror"

Ne Idee dazu? :P

JasonDX 16. Mai 2008 20:43

Re: [DirectX] Textur flippen
 
Ja, eine Spiegelung wegmachen ^^
Bspw. damit, dass man meinen Denkfehler miteinbezieht :duck: und die Texturadressierung auf Wrap lässt. Im Bild ists auch mit Wrap, nicht mit Mirror gezeichnet ;)

greetz
Mike

.chicken 16. Mai 2008 20:54

Re: [DirectX] Textur flippen
 
Ja, aber im Bild ist es auch so, dass du nicht dasselbe Frame in der Spiegelung hast, wie im Ausgangsbild.
Das hätte man nur mit "Mirror" :P

Problematisch :-\

JasonDX 16. Mai 2008 21:22

Re: [DirectX] Textur flippen
 
Grml, warum mach ich die Dinge immer so kompliziert?
Du berechnest ja insgesamt 4 Texturkoordinaten, oder? Wenn ja, tausch dann bspw. immer die x-koordinate aus, um an der y-Achse zu spiegeln, und entsprechend die y-Koordinaten, um an der x-Achse zu spiegeln. Das sollte dann eigentlich auch schon genügen :gruebel:

Wobei ich den Weg über die Welt-Matrix fast am saubersten/logischsten halte xD

greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz