AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [DirectX] Textur flippen
Thema durchsuchen
Ansicht
Themen-Optionen

[DirectX] Textur flippen

Ein Thema von .chicken · begonnen am 16. Mai 2008 · letzter Beitrag vom 16. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#1

[DirectX] Textur flippen

  Alt 16. Mai 2008, 15:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 15:55
Du kannst entweder die Welt-Matrix entsprechend anpassen (Rotation), oder die Texturkoordinaten negieren. Beides sollte den gewünschten Effekt erzielen.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#3

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 16:32
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
Angehängte Grafiken
Dateityp: bmp walking_103.bmp (1,00 MB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 16:43
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#5

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 17:20
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#6

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 18:08
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
Miniaturansicht angehängter Grafiken
textureaddressing_977.png  
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#7

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 20:39
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?
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#8

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 20:43
Ja, eine Spiegelung wegmachen ^^
Bspw. damit, dass man meinen Denkfehler miteinbezieht und die Texturadressierung auf Wrap lässt. Im Bild ists auch mit Wrap, nicht mit Mirror gezeichnet

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#9

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 20:54
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"

Problematisch :-\
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#10

Re: [DirectX] Textur flippen

  Alt 16. Mai 2008, 21:22
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

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

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.
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