![]() |
[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. |
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 |
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:
Hier werden die Texturkoordinaten einfach entsprechend transformiert und das scheint mit der Reflektion nicht zu funktionieren.
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)); 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 |
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
![]()
Code:
Damit brauchst du zum Spiegeln lediglich die x/y-Koordinate (je nach dem, an welcher Achse du spiegeln willst) negieren.
Device->SetSamplerState(0 /*evt. anzupassen*/, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR); greetz Mike |
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:
Dann akt.Spalte * Spaltenbreite(1/Spaltenzahl) und das selbe mit den Reihen.
Frame mod Spaltenzahl //aktuelle Spalte
Frame / Spaltenzahl ohne den Teil hinter dem Komma //aktuelle Zeile 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. |
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 |
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 |
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 |
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 :-\ |
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 |
Re: [DirectX] Textur flippen
Ja, also das Problem beim Austauschen ist, dass ich ja nicht auf die transfomierten Texturkoordinaten zugriefen kann.
Ich habe nur die x-Koordinaten: 0 und 1 Die Koordinaten werden dann immer mit einer Matrix transformiert. Ich kann sie aber nicht direkt "eingeben". Naja und über die Weltmatrix...wie soll ich das denn rotieren, damit es gespiegelt wird? :gruebel: Edit: Aso, habe nun folgendes:
Delphi-Quellcode:
Wobei Matrix die Matrix meines Meshes ist. Hier ist nun aber das Problem, dass die Bewegungen auch gespiegelt sind, er sich also nicht wie vorher von links nach rechts sondern umgekehrt bewegt. Oder meintest du das ganz anders?
Mat1 := D3DXMatrixIdentity;
Mat2 := D3DXMatrixIdentity; if FlipX then D3DXMatrixRotationY(Mat1, 3.13); if FlipY then D3DXMatrixRotationX(Mat2, 3.13); D3DXMatrixMultiply(Mat3, Matrix, Mat1); D3DXMatrixMultiply(Mat3, Mat3, Mat2); Parent.Device.SetTransform(D3DTS_WORLD, Mat3); Edit: Lol falschrum die Matrizen multipliziert. Nun gehts. Ist das denn so wie du es meintest? Ist das ne vernünftige Lösung? :) Achso und umwieviel muss ich genau rotieren um 180° zu erhalten? |
Re: [DirectX] Textur flippen
Zitat:
Zitat:
greetz Mike |
Re: [DirectX] Textur flippen
Ach herrjeh, soviele Probleme wegen sonem kleinen Mist. Naja nun klappts ja.
VIELEN DANK FÜR DEINE UNTERSTÜTZUNG :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz