Welche 2.5D Api nehme ich?

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
udok
Beiträge: 40
Registriert: 01.02.2022, 17:34

Welche 2.5D Api nehme ich?

Beitrag von udok »

Hi,

Ich bin neu in der Grafikprogrammierung, und brauche etwas Hilfe.

Es geht im Prinzip um ein Vektorzeichenprogramm unter Windows 7-10.
Zunächst gibt es nur die typischen 2D Elemente (Linien, Kreise, Ellipsen, Rechtecke, Texte).
In der Zukunft sollen aber auch 3D Objekte dazukommen, also Richtung 3D CAD mit statischen Szenen.
Aber der 2D Anteil ist tendenziell wichtiger. Es wäre auch super, wenn das unter Linux mit Wine läuft.
Programmiersprachen kann ich C/C++, und das ganze soll idealerweise ein Program unter 1 MB werden.
Ich komme irgendwie mit den grossen Frameworks wie Qt oder .NET nicht zurecht.

Der 2D Anteil würde wahrscheinlich gut mit Direct2D gehen,
wahrscheinlich auch mit GDI/GDI+ (mit GDI habe ich schon mal was gemacht)...
Aber ist es nicht gescheiter, alles von Anfang an in Direct3D zu machen?
Oder doch in OpenGL, das wird wahrscheinlich von Wine besser unterstützt?

Das Umschalten von 2D und 3D stelle ich mir ziemlich kompliziert vor.
Wenn ich gleich alles in 3D mache, kann ich die 2D Grafik einfach in der x-y Ebene zeichnen,
wo ich von oben draufschaue. Wenn ich 3D will, ändere ich einfach den Blickwinkel.

Aber soweit ich weiß, kann Direct3D keine Texte oder Kreise von Haus aus zeichnen,
und Feinheiten wie Strichstärke oder Line-Caps sollen auch einstellbar sein...

Habt ihr da Erfahrung, mit welcher API ich das am besten mache?

Danke & Grüsse,
Udo
smurfer
Establishment
Beiträge: 195
Registriert: 25.02.2002, 14:55

Re: Welche 2.5D Api nehme ich?

Beitrag von smurfer »

Hm, so ganz weiß ich zwar noch nicht, was du suchst, aber wenn schon Linux und Windows im Spiel sind, würde ich erstmal zu OpenGL oder Vulkan greifen (warum unbedingt wine und nicht portabler Code und natives Linux/Windows?).

Dafür gibt es natürlich unzählige Wrapper, Engines, Tools, Frameworks... als C++-basierte Middleware hat mir https://magnum.graphics/ immer recht gut gefallen, falls du nicht jeden einzelnen OpenGL-Befehl selber schreiben möchtest. Es ist keine komplette Spieleengine, bietet jedoch schon ein paar nette Features außerhalb eines reinen Wrappers.
Es ist auch sehr modular aufgebaut, du kommst auf jeden Fall unter 1MB, wenn du möchtest.

Falls es doch etwas rudimentärer, beispielsweise reines OpenGL, sein soll, ist es hilfreich, eine Bibliothek zu haben, die dir (plattformunabhängig) den Kontext erstellt, wie beispielsweise https://www.glfw.org/. Weitere Komponenten für die Abstraktion, wenn es nicht nur bei Grafik und Input bleiben soll, liefern dann Frameworks wie https://www.sfml-dev.org/ oder https://www.libsdl.org/. Dieses sind neben dem oben genannten glfw auch häufig die Backends für Middlewares wie Magnum.

Edit: Das ist zugegeben subjektiv und wie erfragt durch Erfahrungen geprägt. Mit DirectX/-3D/-2D kenne ich mich ebensowenig wie mit GDI aus, allerdings klingt deine Anfrage auch etwas mehr nach portablem Ansatz (die Anforderung mit wine musst du nochmal erklären ;-) )
NytroX
Establishment
Beiträge: 358
Registriert: 03.10.2003, 12:47

Re: Welche 2.5D Api nehme ich?

Beitrag von NytroX »

Also das kommt jetzt stark drauf an, was du machen willst.
Zunächst spichst du von 2.5D. Das ist normalerweise kein echtes 3D - d.h. alles findet in 2D statt und die 3D Modelle werden einfach vorher z.B. in ein Bild gerendert und dann benutzt.
Andersherum kannst du natürlich auch 2D in eine Textur malen und die dann im Raum platzieren, wie du es erwähnt hattest. Dann laufen aber alle Berechnungen in 3D ab.

Wenn du dich damit schon auskennst, kannst du natürlich einfach Direct2d und Direct3d nehmen.
Hier steht auch, wie die beiden oben genannten Möglichkeiten mit DirectX funktionieren:
https://learn.microsoft.com/en-us/windo ... n-overview

Ansonsten kannst du natürlich auch jede andere Library nehmen, vielleicht wäre Cross-Platform ja tatsächlich eine Idee.
Ansonsten ist Cairo eine 2d Library, die deine Anforderungen aus meiner Sicht gut erfüllt - malen mit Pinseln und Strichstärke usw. geht alles.
Siehe hier https://www.cairographics.org/samples/ und https://www.cairographics.org/cookbook/ellipses/
Und dann kannst du das alles mit SDL in 3d rendern.

Unter 1MB wird aber schwierig - alleine die Unicode-Tabellen kommen da schon dran oder drüber. D.h. wenn du eine Library verwendest, die UTF8 kann, dann könnte es sein dass du schon drüber bist. Und da ist noch nix gerendert, alleine der Support für Funktionen wie Groß- und Kleinschreibung braucht das schon. Und das heißt, dass diejenigen Libraries, die Text unterstützen, meistens entsprechend groß sind.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2352
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Welche 2.5D Api nehme ich?

Beitrag von Jonathan »

udok hat geschrieben: 18.11.2022, 14:18
Habt ihr da Erfahrung, mit welcher API ich das am besten mache?
Ich würde sagen, wenn du schon Erfahrung mit OpenGL / Direct X hast, nehm vielleicht einfach das.

Seit dem alles über Shader läuft sind die APIs ja nicht mehr so wahnsinnig dick, und ein paar Linien oder Dreiecke zeichnen geht mit verhältnismäßig wenig Aufrufen. Und eine extra Funktion um Boxen oder Kreise zu zeichnen braucht man nur wirklich nicht, wenn man schon Linien Zeichnen kann hat man die Funktionen dafür auch schnell getippt - dafür würde ich jetzt nicht das Framework wechseln. Selbst sowas wie Bezier-Splines kann man innerhalb eines Tages implementieren, wenn man etwas Mathe-Affin ist - der ganze Rest der GUI-Entwicklung dürfte da wesentlich länger dauern.

Liniendicke sollte auch gehen, allerdings bin ich mir nicht so ganz sicher, wie das mit Zoomen aussieht und mit Linien die dünner als ein Pixel sind. Aber du kannst dir vermutlich auch SuperSampling und Linien als Boxen rendern leisten und damit immer noch selbst auf älteren Laptops sehr sehr viele Objekte zeichnen können (sicherlich mehr als wenn die Linien aus einer reinen 2D API kommen, die die GPU nicht benutzt).

Was mich ein wenig irritiert ist die Idee mit den unter 1 MB. Also, alleine mit den DLLs für Qt landest du ja schon bei um die 20 MB. Gibt es einen bestimmten Grund, weshalb es klein sein soll?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Jonathan
Establishment
Beiträge: 2352
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Welche 2.5D Api nehme ich?

Beitrag von Jonathan »

Oh, btw. es geht ja nicht nur um das Zeichnen von 2D Grafiken, du brauchst ja auch den ganzen GUI Kram noch. Dafür würde ich vermutlich schon so Richtung Qt gehen (damit hab ich auch irgendwie am meisten Erfahrung), einfach weil du für eine "professionelle" CAD Anwendung vermutlich nicht sowas "frickeliges" wie ImGUI benutzen willst (alleine für so Kram wie vernünftige Datei-Öffnen-Dialoge). Man kann natürlich auch direkt GDI oder so verwenden, aber ich persönlich würde nicht für eine low-Level GUI Lösung Tage an zusätzlicher Entwicklung in Kauf nehmen nur um am Ende ein paar MB an DLLs zu sparen. Man will natürlich auch keine super nischige Lösung benutzen, für die es dann ab nächsten Monat keine Update mehr gibt. Qt wird sicherlich auch in 10 Jahren noch auf aktuellen Plattformen laufen.

Insgesamt würde ich jetzt aber nicht unbedingt strickt sagen: Nimm Qt+OpenGL, sondern meinen dass du mit den Gründen weshalb ich diese Kombination benutzen würde, vlt. ein paar Argumente hast anhand derer du das für dich richtige Framework auswählen kannst. (d.h.: Manche Features brauchst du nicht sondenr kannst sie schnell selbst basteln; man ist meist mit dem was man schon kennt am schnellsten; ein dickes Framework von dem man nur einen Bruchteil benutzt ist nicht Größeneffizient aber möglicherweise Entwicklungseffizient)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
udok
Beiträge: 40
Registriert: 01.02.2022, 17:34

Re: Welche 2.5D Api nehme ich?

Beitrag von udok »

Danke für die vielen guten Tipps und super Links!

Es handelt sich wirklich erst mal um ein 2D Programm das aber irgendwann eine 3D Komponente bekommen soll.
Der 2D Anteil mit Text ist aber wichtig und soll qualitativ hochwertig ausschauen.

Ich habe einfach noch zu wenig Ahnung, wie sich die 2D und 3D Api vertragen und welche Kombinationen gut funktionieren.
Eine reine 3D Api wie DirectX oder OpenGL von Anfang an zu verwenden, wäre verlockend, aber ich möchte die 2D Funktionen nicht selber programmieren. Sonst wird das in der Freizeit nie fertig.

Windows ist die Haupt-Platform, da soll das Program gut laufen.
Daher werde ich es mit Direct2D versuchen, und den 3D Kram dann mit DirectX 11 machen.

Linux und Mac Kompatibilität wäre natürlich super, aber das geht mit Wine hoffentlich.

Wie gesagt, möchte ich aus einem völlig irrationalen Grund unter 1MB bleiben, und ich bin kein grosser Freund von Frameworks wie Qt,
auch wenn die Entwicklung wahrscheinlich deutlich schneller wäre. Wahrscheinlich habe ich zu viel Low-Level Zeugs gemacht...

Grüsse,
Udo
smurfer
Establishment
Beiträge: 195
Registriert: 25.02.2002, 14:55

Re: Welche 2.5D Api nehme ich?

Beitrag von smurfer »

Hi Udo,

vielleicht noch ein paar Worte zum von mir erwähnten https://magnum.graphics/ nach Deinen weiteren Erklärungen.

Ich möchte diese Middleware nicht promoten, ich habe einfach nur ein wenig Erfahrung und weiß aus dieser auch, dass der Hauptentwickler (und auch viele Nutzer) sehr hilfreich und unterstützend z.B. bei gitter sind.

Davon ab, hat das o.g. Magnum Vor- wie Nachteile. Subjektiv sind für mich Vorteile
  • Modernes C++
  • 2D/3D zur Compilezeit soweit möglich über Templates
  • Modular
  • Portabilität: Linux, Windows, Mac, WebGL,...
  • Gut dokumentiert
  • Gute Zwischenlösung zwischen Wrapper und Engine. Man muss nicht jeden GPU-Api-Befehl selbst implementieren, bekommt aber auch keine fertige Engine, die man nur noch mit Skripten und Assets füllt.
Nachteile:
  • Sehr "geschwätzig" oder siehe Vorteile: Modernes C++. Tatsächlich hat dies vielleicht mehr mit C++ als mit Magnum zu tun, aber die Typen/Klassen/Methoden, was auch immer sind eben sehr C++-modern, was in meinen Augen auch nicht immer das Beste sein muss. Bis man sich durch die (gute) Api-Doku geklickt hat, um den Template-Rattenschwanz aufzulösen, vergeht schonmal etwas Zeit.
  • Kein ausgereiftes GUI-Framework, dies ist noch im sehr frühen oder vielmehr vernachlässigtem Stadium
  • Keine "Engine", es ist eben "nur" ein fortschrittlicher Grafikwrapper mit vielen Tools, aber Audio, Physik oder Ähnliches sind nicht abgedeckt.
Auch wenn das recht ungleich verteilt aussieht, ist es natürlich so erstmal nicht gewichtet. Je nachdem was dich stört oder was dir fehlt, mögen Vor- oder Nachteile überwiegen und dies ist auch nur ein kleiner subjektiver Auszug.

Aus meiner Sicht, für den Anfang und das was du an Anforderungen genannt hast, aber durchaus geeignet.

Edit: Mein kleines Ex-Hobbyprojekt https://github.com/bfeldpw/battlesub ist unter Linux mit GCC kompiliert 1,2MiB große, und dort nutze ich noch mehr als nur Magnum (Box2D, EnTT). Es ist 2D, jedoch zumindest recht GPU-lastig, vielleicht hilft es dir ja, dort mal reinzuschauen.
udok
Beiträge: 40
Registriert: 01.02.2022, 17:34

Re: Welche 2.5D Api nehme ich?

Beitrag von udok »

Danke für den Link zu deinem Ex-Hobbyprojekt, das schaut super aus!

Ein brauchbares GUI Framework wäre mir schon recht wichtig.
Das ist leider ein Trauserspiel, auch unter Windows, wenn man unter 1 MB bleiben will.

Was hältst du von Imgui?
Kann man damit auch komplexere GUIs machen mit
Tabs, Menüs mit Icons, Fenster-Docker, Help-Bubbles, mehrere Toolboxen, Statusbar, Rebars
und mit mehreren Hauptfenstern auf unterschiedlichen Monitoren (DPI Skalierung)?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Welche 2.5D Api nehme ich?

Beitrag von Schrompf »

IMGUI ist ein Game-UI, das benutzt keine WinAPI, sondern Deine 3D-API. Demzufolge ist sowas wie DPI-Skalierung Dein Brot. Ansonsten ist es sehr beliebt, aber mir nur als Debug-UI bekannt. Ich weiß nicht, ob jemals jemand ne Endnutzer-UI damit gebaut hat. Ob man das Ding überhaupt so gut skinnen kann?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
udok
Beiträge: 40
Registriert: 01.02.2022, 17:34

Re: Welche 2.5D Api nehme ich?

Beitrag von udok »

Ich kenne tatsächlich EIN brauchbares Program, das IMGUI verwendet, und auch sehr gut bedienbar ist.
Das ist ein Tool für PCB Prints, da werden Motherboard Dateien in einem eigenen Herstellerformat eingelesen,´
und im wesentlich am Bildschirm mit der Info welche Bauteile wo sind angezeigt.
Damit lassen sich Fehler leichter finden und Reparaturen machen.
Das Programm schaut sogar gut aus, auch wenn es nicht in die Standards Windows Welt passt
(das tun sowieso immer weniger Programme).
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Welche 2.5D Api nehme ich?

Beitrag von Matthias Gubisch »

Das Frontend vom dem Profiler ist komplett mit imgui implementiert, nur um aufzuzeigen was damit machbar ist.

https://github.com/wolfpld/tracy

Als Debug Ui finde ich imgui sogar ganz praktisch, schnell eingebunden, stateless und relativ flott
Ob ich damit aber komplexere guis (wie den profiler) erstellen will, puh ich weis nicht, an manchen stellen schon etwas frickelig... dann doch lieber Qt auch wenns viel bloat mitbringt
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Welche 2.5D Api nehme ich?

Beitrag von Matthias Gubisch »

Matthias Gubisch hat geschrieben: 25.11.2022, 12:40 Das Frontend vom dem Profiler ist komplett mit imgui implementiert, nur um aufzuzeigen was damit machbar ist.

https://github.com/wolfpld/tracy

Als Debug Ui finde ich imgui sogar ganz praktisch, schnell eingebunden, stateless und relativ flott
Ob ich damit aber komplexere guis (wie den profiler) erstellen will, puh ich weis nicht, an manchen stellen schon etwas frickelig... dann doch lieber Qt auch wenns viel bloat mitbringt
Tante Edith meint: Andererseits sind die ganzen anderen einbettbaren Frameworks auch nur anders und nicht besser, also wenn du bei der Anforderung mit < 1MB bleibst wirst um sowas nicht drum drum kommen
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten