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

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

21

05.09.2015, 21:31

Die Geschwindigkeit solltest du schon erreichen. Es gibt halt nur ein festes Qualitätslimit und die Verwendung von OpenGL scheint mir unnötig.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

22

06.09.2015, 10:48

Die Geschwindigkeit solltest du schon erreichen. Es gibt halt nur ein festes Qualitätslimit und die Verwendung von OpenGL scheint mir unnötig.
Was jetzt? Ich dachte OpenGL ist die beste Lösung dafür???

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

23

06.09.2015, 14:00

OpenGL scheint mir dafür nicht gut geeignet, weil es mit sehr vielen Funktionen und Probleme daherkommt, den du eigentlich nicht brauchst. Auch GPU Beschleunigung ist nicht notwendig und ist halte es auch für fragwürdig, wann und ob das überhaupt im enorm unterteilten Immediate Mode schneller ist als eine einfache Operation auf der CPU.

Ich würde an deiner Stelle lieber auf der CPU bleiben. Du gehst einfach parallel jeden Bildpunkt des Zielbildes durch und überprüfst erstmal, in welchen Viereck er nun liegt und wendest dann auf die Formel darauf an um herauszufinden welcher Bildpunkt des Quellbildes dort liegt. Den kannst du dann einfach nachschlagen. Für einfaches Antialiasing und Texturfilterung braucht man auch einfach nur mehrere Samples zu nehmen.

Als Vorteile sehe ich, dass du nicht von der GPU und den Grafiktreiber und dessen Limits bezüglich Framebuffer, Texturgröße, Shader (für exakte Lösung) etc. abhänig bist und in C# bleiben kannst. Außerdem müssen nicht alle Daten zur oder von der GPU kopiert werden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (06.09.2015, 14:09)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

06.09.2015, 18:34

So'n Quatsch. Mit z.B. SFML hat er überhaupt keine Probleme oder unnötig viele Funktionen. Das ist in wenigen Zeilen geschrieben und auch wieder als Bild exportiert. Niemand hat gesagt, dass er alles von Hand schreiben sollte und muss. Wie oft er da was von CPU zur GPU und zurück kopiert, ist total egal, wenn er damit noch immer um den Faktor 100 schneller ist.
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]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

25

06.09.2015, 19:07

SFML oder nicht, ist doch kein Unterschied. Und er hat unnötig viele Abhänigkeiten. SFML.Net braucht SFML. SFML erfordert unnötiges Fenster. Und SFML braucht OpenGL. Oder in seinem Fall eben statt OpenGL SharpGL. Zu den Problemen gibt es zum Beispiel, dass ein entsprechender Grafikkartentreiber installiert sein muss. Außerdem benötigt er doch gar keine OpenGL Features außer triviale Rasterisierung. Das ist doch in ein paar Zeilen C# geschrieben.

Das ist ein Spieleprogrammiererforum. Das ist es nicht verwunderlich, dass hier gleich OpenGL und SFML empfohlen wird. Dort ist das richtige Tool. Für Image Processing und ganz besonders die hier benötigte Transformation, ist OpenGL aber nicht das richtige Tool und SFML, das Fenster und die Unterteilung einzurichten braucht vielleicht nur "wenige Zeilen", aber einfach über die Quellpixel auf der CPU zu iterieren und die Transformation direkt anzuwenden sind ebenfalls nur "wenige Zeilen". Mit dem Vorteil, dass es "Self Contained" ist.

Das es tatsächlich schneller ist steht auch nicht fest, wenn er das mit starker Unterteilung umsetzt. Die Zeit die für das Öffnen eines Contexts und den Datentransfer draufgeht, kann bei vielen Computern bzw. nicht groß genugen Bildern auch im Vergleich zu den einfachen Berechnungen sehr groß werden. Selbst wenn der Rest dann "100 mal" schneller läuft (und das ist ein wenig übertrieben), dann kann es immernoch langsamer sein.

GPGPU kann natürlich schneller sein. Aber es ist sehr gut möglich, dass es in seinem Fall bei der Umsetzung keinen Vorteil bringt.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

26

06.09.2015, 19:51

Gerade benutze ich kein SFML, sondern SharpGL. Das ist - soweit ich weiß - nur ein OpenGL Wrapper und sollte nicht so viel unnötiges mitbringen.
Dabei will ich jetzt erst einmal bleiben.

Edit: Merke gerade das SharpGL doch noch etwas mehr ist als ein Wrapper, aber das hat den Vorteil, dass ich kein extra Fenster zum Rendern benötige, sondern einfach das SharpGL Controll auf die schon verwendete WindowsForm gezogen habe. Dort liegt es nicht sichtbar unter einem Panel, funktioniert aber trotzdem.

Wenn ich die Bildelemente nochmal in einzelne Bildelemente zerlege, scheint bei mir aber immer das letzte Dreieck nicht verformt zu werden. Bleibt das auch so, wenn ich es beliebig oft weiter zerteile, dass nie das komplette Bild verzerrt wird, sondern ein immer kleiner werdendes Element unverzerrt bleibt?


(Bildelement zerlegt in 2x1 Elemente)

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


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

27

06.09.2015, 20:11

Ja das bleibt so. Du müsstest es im Prinzip so häufig unterteilen (viele hunderte bis tausende) mal in beide Richtungen, bis der unverzerrte Bereich nur noch wenige Pixel groß ist und so nicht mehr auffällt. Und das ist eben der Punkt, an dem ich den Ansatz als falsch ansehe. Wenn du es jetzt unbedingt mit OpenGL machen willst, dann lässt sich das richtig nur mit einem Shader richtig machen. Ich habe ihn ja schon genug verlinkt, wie das geht. Allerdings bin ich eben nicht davon überzeugt, dass OpenGL hier überhaupt noch hilfreich ist.

Und dann sehe ich das eben so, dass OpenGL nicht gerade die kleinste und unproblematischte Abhänigkeit ist. Genauso wie ich nicht Boost einbinden würde, bloß weil ich irgendeine einzelne Funktion in Boost.Geometry brauche. Das sollte nicht falsch verstanden werden. Boost ist eine Spitzenbibliothek, aber für diesen hypotetischen Fall einfach nicht die richtige Wahl. Besonders nicht, wenn die gefragte Funktion (in diesem Fall einen Punkt Polygon Schnitttest) in 10 Zeilen selbst implementiert werden kann.

Der Grund warum dir OpenGL von vielen vorgeschlagen wurde ist, dass viele (auch ich) nicht an das Problem der Interpolation gedacht haben und dann normale texturierte Quads exakt wie dein Problem aussehen.

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


MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

28

06.09.2015, 20:42

Ok, das ist suboptimal.

Mal abgesehen von dem verlinkten Shader als Alternative, wenn ich es jetzt doch auf der CPU berechnen will, gibt es noch Möglichkeiten, wie ich diesen Quad Distort Algorithmus noch optimieren kann, damit die Berechnung schneller geht? Bitmap.SetPixel() hatte ich dafür schon doch eine extra Klasse die LockBitmap() verwendet ersetzt.

Was mir noch eingefallen ist, vielleicht lässt sich dieser Algorithmus auch als Compute Shader, oder mit CUDA umsetzen. Das könnte doch dafür durch die Parallelisierung noch mehr Geschwindigkeit bringen. Oder wäre das dann nur ein Umständlicher Weg für Funktionen, die OpenGL bereits bietet? Davon mal abgesehen, dass es wahrscheinlich zu aufwendig wäre?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

06.09.2015, 22:06

SFML erfordert unnötiges Fenster.
Ach ja? Das is mir aber neu. RenderTextures haben ihren eigenen Context. Klar, ich kann den Käse von Hand schreiben inklusive der Samplings und große Freude haben, sobald ich eine feine Unterteilung der Verzerrungen wie über ein Gitter vornehme... oder ich nehme mir ein Framework und einen Shader für korrekte Quad-Verzerrung und bin alle Probleme in wenigen Zeilen Code los und das mit Realtime-Performance ohne die CPU zu belasten. Sicher, ja, das benötigt einen OpenGL Treiber. Vielleicht sollte man nochmal fragen wofür das ganze sein soll und ob die Anforderung an OpenGL ein Problem ist oder nicht und welche Performance er denn gern hätte.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (06.09.2015, 22:12)


MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

30

06.09.2015, 22:43

So hohe Anforderungen gibt es nicht, mit dem Programm kann man die Punkte in einem beliebig großen Gitter (also ca 1-20^2 Bildelemente) bewegen. Das funktioniert schon und das habe ich mit GDI+ geschrieben, WindowsForms, C#. Jetzt soll in dieses Gitter ein Bild gerendert werden als Vorschau, wenn das passt, müssen alle anderen Bilder im Ordner mit der selben Verzerrung gerendert und gespeichert werden. Ich denke es können bis zu 100 Bilder sein, aber selbst wenn das ein paar Minuten dauert wäre es ok.
Trotzdem, wenn die Berechnung schneller gehen würde, wäre das natürlich umso besser, solange es noch reell umsetzbar bleibt mit meinen aktuellen Kenntnissen.
Notwendige librarys wären kein Problem, solange ich keine Lizensgebüren bei der Verwendung zahlen muss und es ab Windows 7 funktioniert.

Was würdet ihr jetzt empfehlen, mit OpenGL und einer feineren Unterteilung weitermachen - dann bei SharpGL bleiben, oder auch SFML verwenden?
Das Shader Thema versuchen - damit habe ich aber überhaupt keine Erfahrung?
Oder doch den Algorithmus für die .Net Bitmap Klasse, damit alles auf der CPU laufen kann?

Edit:
Die Bilder liegen als .jpg vor, für SharpGL muss ich diese dann zur Laufzeit noch in ein .bmp umwandeln. Das könnte ich mit der Bitmap Klasse machen, würde aber dann auch die Performance deutlich verschlechtern. Sollte ich in dem Fall dann eine extra library für diesen Zweck suchen?

Werbeanzeige