Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

11

19.06.2015, 22:22

Die Implementierung aus dem zweiten Link funktioniert, ist aber langsam (mehrere Sekunden um einen Bildabschnitt zu verzerren).

Was wäre nun der beste Ansatz, damit die Verzerrung schneller funktioniert? Vermutlich mit DirectX. Aber soll ich dann wieder das Bild in Teilabschnitte selbst zerlegen und mit der DirectX Methode D2D1_MATRIX_4X4_F jedes einzeln darstellen, oder wäre es auch möglich, dass ich entsprechend dem Gitter ein Polygon-Netz erstelle und darauf dann das Original Bild lege? Also würde der letzte Ansatz funktionieren - ich hab noch nie mit DirectX gearbeitet, aber ich denke wenn man z.B. in Blender eine Textur auf ein entsprechendes Polygon-Netz legen würde, sieht es genau so aus.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

20.06.2015, 08:28

oder wäre es auch möglich, dass ich entsprechend dem Gitter ein Polygon-Netz erstelle und darauf dann das Original Bild lege?
Genau das macht jedes 3D-Spiel. Es nutzt Meshes aus Polygonen und pappt da Texturen drauf.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

13

20.06.2015, 15:47

oder wäre es auch möglich, dass ich entsprechend dem Gitter ein Polygon-Netz erstelle und darauf dann das Original Bild lege?
Genau das macht jedes 3D-Spiel. Es nutzt Meshes aus Polygonen und pappt da Texturen drauf.
Wenn das so ist, sollte es dann ja ziemlich schnell gehen, dass verzerrte Bild zu rendern, bei Spielen gibt es ja normalerweise einen Menge von Objekten, die alle gleichzeitig und ein paar mal pro Sekunde gezeichnet werden.

Hat jemanden eine Empfehlung für ein entsprechendes DirectX/OpenGl Tutorial?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

14

21.06.2015, 12:28

Was genau hast Du denn vor? Was hier bisher gar nicht erwähnt wurde, wenn ich's nicht übersehen habe, ist die gute alte Distortion Map. Das ist der Standardtrick für Explosions-Druckwellen, Hitzeflimmern, Predator-Tarn-Wabbern usw., seit das die GPUs können.

Eine Distortion Map besagt eigentlich nur: "von wo relativ zu hier kommt das, was ich hier anzeigen will". In der Distortion Map steht also ein Offset drin, wohin relativ zum aktuellen Pixel man greift, um den fertigen Pixel zu bekommen. Und umgesetzt wird das mit DirectX oder OpenGL, indem Du 1) Dein zu verzerrendes Ding in eine Textur renderst, 2) die Distortion Map renderst, indem Du z.B. spezielle Sprites mit AlphaBlending zeichnest und 3) einem kleinen Shader, der die beiden Texturen kombiniert.

Pseudocode Shader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sampler2D TexBild;
sampler2D TexDistortion;

float4 MachDatDingJetzt( in float2 texkoords)
{
  // Offset lesen
  float2 offset = tex2D( TexDistortion, texkoords);
  // auf -1 .. +1 erweitern
  offset = offset * float2( 2, 2) - float2( 1, 1);
  // anwenden
  float2 tk = texkoords + offset;
  // und Bild von da lesen
  float4 ergebnis = tex2D( TexBild, tk);
  return ergebnis;
}
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

15

21.06.2015, 17:27

@Schrompf
Danke schon mal für deinen Code. Ich bin mir nur nicht sicher, ob das in die richtige Richtung geht, was ich suche. Ist das so etwas wie der Displacement map effect?

Zurzeit arbeite ich an einer App, mit der sich Bilder in Bildern einfügen lassen, wobei sich diese Bilder im Bild frei verformen lassen, vergleichbar mit dem Gitter aus meinem ersten Posting.

Mit dem Quadrilateral-Distortion Algorithmus funktioniert es schon so, wie ich es mir vorgestellt hatte (wenn ich das Bild in einzelne Fragmente aufteile und jedes dann entsprechend verziehe). Mit dieser Funktion kann ich den Teil der App auch umsetzen, aber es ist wie schon erwähnt recht langsam. Deswegen auch meine Frage, was es da sonst noch für Möglichkeiten dafür gibt. Die DirectX Methode D2D1_MATRIX_4X4_F hab ich schon mal erwähnt, die das gleiche macht, wie der Quadrilateral-Distortion Algorithmus von oben. Das wäre dann bestimmt schneller (selbst wenn ich es für jedes Fragment des Bildes anwenden muss), als wenn ich es so machen wie bisher, da DirectX dann doch dafür die Grafikkarte zur Berechnung nutzen wird, oder?

BlueCobold hat vorgeschlagen ich soll dem Gitter entsprechend ein Polygon erstellen und darauf dann eine Textur legen. Wäre das dann noch schneller, von der benötigten Berechnungszeit? Dann müsste ich mich halt ziemlich in die ganze DirectX/OpenGl Thematik einarbeiten, bis jetzt habe ich nur mit der Bitmap Klasse gearbeitet. Mein bisherigen Code könnte ich für D2D1_MATRIX_4X4_F auch leichter anpassen, als für so ein Polygon Netz.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

21.06.2015, 17:39

Die Berechnung für die Polygone und Textur sind quasi Null. Klar hängt es etwas von der Anzahl der Polygone ab, aber selbst 200x200 ist von der Performance her quasi gratis. Das ist genau das, was die Grafikkarte *perfekt* kann - Bilder verzerren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

17

21.06.2015, 18:09

Okay, wenn ich das dann mit einem Polygon umsetzen will, würde es dann genügen, wenn alle Punkte in einer Ebene liegen und ich die Punkte nur entsprechend dem Gitter auf der Ebene verschiebe, oder muss ich die Punkte dann irgendwie im drei dimensionalen Raum bewegen um den entsprechenden Effekt zu erhalten?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

21.06.2015, 18:10

Ebene und darin verschieben reicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

19

21.06.2015, 18:15

Dann werde ich es so mal versuchen. Hab mir mal ein Buch in der Bibliothek bestellt, vielleicht kommt da sogar genau das vor, was ich brauche (so wie du es beschreibst, ist es ja etwas sehr grundlegendes in der Grafikprogrammierung):
[amazon]1936420228[/amazon]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

21.06.2015, 18:18

War nicht irgendwo von einer App die Rede? Da hilft DX gar nichts.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige