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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

04.09.2015, 12:31

Ich hätte schon lange zu OpenGL gegriffen, wie schon im vorhergehenden Topic gesagt. Keine Ahnung, was es da für Libs sonst noch gibt, sorry.
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

12

04.09.2015, 12:59

Dann muss ich mich wohl doch noch überwinden und es mit OpenGL versuchen.
Oder ich versuche es mit SFML/SDL/XNA mit den Vertex Arrays.

Eine Alternative wäre noch ImageMagic, das bietet Affine Image Distortion an, muss aber über die Kommandozeile gesteuert werden. Ich teste das noch vorher.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

13

04.09.2015, 16:04

Ich würde das direkt mit OpenGL oder DirectX machen, insbesondere mit DirectX sollte das ziemlich einfach sein und schönen Code produzieren. Mit OpenGL wird es auch nicht wirklich schwieriger, nur macht die API weniger Spaß und das ganze Setup drumherum ist etwas nerviger, so dass dann SDL oder ne alternative ganz praktisch sind.

In beiden Fällen kannst du dir dann einfach ein entsprechendes Mesh bauen und beliebig verformen. Wenn die Texturkoordinaten fest sind und dem unverzerrten Bild entsprechen sollte es einfach funktionieren.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

14

04.09.2015, 21:04

Mit OpenGl (bzw SharpGL) ist es doch nicht so kompliziert wie ich dachte. Hab es gerade getestet und es funktioniert :D
Jetzt muss ich den Code nur noch in meinem Programm austauschen.



C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
OpenGL gl = openGLControl.OpenGL;

//  Clear the color and depth buffer.
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.Ortho2D(0, this.Width , this.Height , 0);
gl.Disable(OpenGL.GL_DEPTH_TEST);

//  Load the identity matrix.
gl.LoadIdentity();

//  Bind the texture.
texture.Bind(gl);

gl.Begin(OpenGL.GL_QUADS);

gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, -1.0f); //BittinLeft
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, -1.0f); //BottomRight
gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, 1.0f); //TopRight
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, 1.0f); //TopLeft

gl.End();

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

15

05.09.2015, 17:51

Wenn ich die Bildverzerrung genauer anschaue, wirkt die Verzerrung aber immer noch unnatürlich.
Das Viereck scheint in zwei Dreiecke geteilt gerendert zu werden. Wenn ich z.B. den linken oberen Punkt in die Mitte verschiebe, wird anscheinend nur das Bild oberhalb der Kante zwischen linker unterer und rechter oberer Ecke verformt.

Wenn ich stattdessen das Bild auf einem Mesh, oder so ähnlich rendere, würde es dann anders aussehen?

Angenommen das Bild wäre auf ein Stück Stoff gedruckt und der wird dann an vier Punkten wie im Bild gespannt, das würde dann doch den ganzen Stoff beeinflussen und nicht nur den oberen Teil. Wie könnte ich sonst diesen Effekt am besten simulieren?


Edit: Auf dem Karo Testbild ist es besser sichtbar:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

05.09.2015, 18:11

Ja, das war zu erwarten. Es werden nunmal Dreiecke gezeichnet und nicht Vierecke. Eine Lösung ist, sehr viel feiner zu unterteilen - dann fällt es nicht auf.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

17

05.09.2015, 19:18

Eine kleinere Unterteilung klingt gut, aber wie könnte ich das dann machen?

Angenommen ich teile dieses Bild vorher wieder in 3x3 Elemente auf. Dann hätte ich zum Beispiel das Element in der rechten unteren Ecke doch trotzdem nicht verformt, oder?

Über Algorithmen und Lösungsansätze bin ich sehr dankbar!

Edit:
Meinst du ich soll einfach mehr, also genauere Texturkoordinaten und Vertexkoordinaten angeben? Die Texturkoordinaten zu berechnen ist ziemlich einfach, aber die zugehörigen Vertexwerte, da wird es dann schon wieder kompliziert.

Disclaimer: Mein angew. Informatik Studium beginnt erst nächsten Monat :rolleyes:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (05.09.2015, 19:23)


18

05.09.2015, 19:38

Warum kann er es nicht einfach mit GL_QUADS rendern? Also klar, wenn GL_VERSION > 3.0 ist, dann gehts nicht anders, aber für den Zweck wär das doch voll ok, nicht?

MfG
Check

EDIT: Oh. Gekonnt übersehen. Entschuldigung. :S

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

19

05.09.2015, 19:45

Also Davids Lösung sollte auf jeden Fall funktionieren, scheint mir aber sehr unbeholfen und ineffizient.

Das eigentliche Problem scheint mir nur mit Shader lösbar. Ohne Shader ist es wahrscheinlich auch nicht sehr schwierig mit "Software Rendering" ganz ohne OpenGL umzusetzen.
Die Demo auf der Seite zeigt, wie es richtig aussieht.
(Noch deutlicher wird, dass gerade Linien gerade bleiben, wenn man im Democode texture2D mit col = vec3(min(fract(uv.x * 20.0), fract(uv.y * 20.0)) > 0.3 ? 0.0 : 1.0); für ein regelmäßiges Gitter austauscht.)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (05.09.2015, 20:19)


MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

20

05.09.2015, 20:55

Danke für deinen Link, wenn sich die Verzerrung so wie in dem WebGL Beispiel verhält, wäre das super.
Allerdings erscheint mir das ziemlich kompliziert. Wird das Ergebnis bei Verwendung eines Shaders anders, oder ist das einfach nur effizienter? Für mein Programm wäre ich schon zufrieden, wenn die Berechnung pro Frame max. ein bis zwei Sekunden dauert, das Bild muss nicht so oft aktualisiert werden.

Für Davids Lösungsansatz hab ich gerade gemerkt, dass ich die Vertexkoordinaten mit Vektorrechnung (wer hätte das gedacht :rolleyes: ) herausfinden kann, da reichen sogar die Schulkenntnisse dafür.

Werbeanzeige