Wie schwer ist es eine einfache 3d Engine zu programmieren?

8 Antworten

Also: Besorg Dir ein gutes Buch über Computergrafik. Dann bekommst Du einen Eindruck.

Eine allgemeine Grafikengine zu schreiben, die besser ist, als das, was Unity und Co machen wird sehr schwer. Die haben viel Personal und das Personal ist gut. D.h. du möchtest allein im Nebenberuf etwas machen, was besser ist, als das, was mehrere Leute im Hauptberuf machen. Aussichtslos, außer wenn Du einen sehr klar definierten Anwendungsfall hast, für den Du besser sein möchtest.

Wenn Du Dich inspirieren lassen möchtest, schau Dir vielleicht an, wie Blender Eevee programmiert hat, die Render Engine für Live Rendering von komplexen Bildern mithilfe von GPU.

Woher ich das weiß:Studium / Ausbildung

Tibor15 
Beitragsersteller
 21.01.2021, 09:31

Danke für die Antwort. Ich möchte einfach nur eine Engine haben, die verschiedene Texturen verarbeitet, man die Kamera schwenken und Objekte rotieren lassen kann. Wie lange braucht man für so etwas?

0
W00dp3ckr  21.01.2021, 09:43
@Tibor15

Das hängt krass davon ab, wie die verschiedenen Substantive in Deiner Frage definiert sind. Wie komplex sind Objekte und Texturen, was ist ein Schwenk etc. und vor Allem: Wie effizient muss die Sache sein.

Mein Rat steht: Kauf Dir ein Buch über die mathematischen Grundlagen über Computergrafik, so wie den Foley-Van Dam und lies da das, was Du wirklich machen willst.

Wenn es Dir nicht um die Freude daran geht, alles von Grund auf selbst zu machen, dann ist die Nutzung von Bibliotheken stark angeraten.

0
Tibor15 
Beitragsersteller
 21.01.2021, 09:47
@W00dp3ckr

Also ich habe mir schon entsprechendes Material besorgt. Ich frage mich jedoch, wie aufwendig es wird das alles zu implementieren. Die Kamera sollte einfach nur mit den Pfeiltasten gesteuert werden. Hast du schon mal eine erstellt?

0
W00dp3ckr  21.01.2021, 11:09
@Tibor15

Die Pfeiltasten sind das geringste Problem.

Nein, habe ich nicht. Aber ich habe an der Uni mit Grundlagen der Computergrafik zu tun gehabt. Und fang doch mal an. Wie lang es dauert hängt eh sehr stark davon ab, wie gut Du als Programmierer bist.

Deine Frage klingt für mich:

Ich möchte barfuß einen Ultramarathon laufen. Was wird meine Zeit auf 100km sein?

Antwort: Nimm lieber ein Fahrrad, Ultramarathon ist echt übel.

Nee, ich will das laufen, aber unbedingt Barfuß. Was wird meine Zeit auf 100km sein? Bei näherem Überlegen reicht auch ein Halbmarathon. Was wird meine Zeit auf 20km sein? Aber barfuß?

1

Relativ schwer für einen anfänger.

Kommt drauf an was du alles für funktionen haben willst.

Du musst dir erst ne grafik API aussuchen, also z.B. openGL, directX oder vulcan.

Damit musst du dann direkt arbeiten.


Tibor15 
Beitragsersteller
 20.01.2021, 16:55

Ne, alles alleine.

0
jort93  20.01.2021, 16:56
@Tibor15

Das geht nicht.

Du musst ja irgendwie mit der grafikkarte kommunizieren. Eine API musst du immer nutzen. Macht jede engine so.

Eine API benutzt du damit deine engine eben nicht nur auf einer grafikkarte(sagen wir mal ne 2080 super) läuft, sondern auch auf einer 1050 Ti und auf einer rx 580.
Ohne so eine api würde das nur auf deinem eigenen rechner funktionieren und auf keinem anderen.
Gleicher grund warum es treiber gibt.

1
Tibor15 
Beitragsersteller
 20.01.2021, 17:00
@jort93

Kann man die nicht selbst programmieren?

1
jort93  20.01.2021, 17:04
@Tibor15

Nein.

Der grafikkarten treiber implementiert gewisse APIs, im falle von einer 2080 Super sind das directX 12.1, OpenGL 4.6, OpenCL 1.2, Cuda 7.1 und Vulkan 1.1.78.

Nun musst du dir eine davon aussuchen um deine engine zu schreiben.

Du kannst nicht direkt auf die grafikkarte zugreifen, das wäre auch nicht sinnvoll, denn dann läuft deine engine eben nur auf diesem modell von grafikkarte und keinem anderen.

Das machen alle engines so. Große engines wie unity unterstützen gleich mehrere, aber eine reicht für den anfang.

Hier z.B. openGL fuktionen https://docs.gl oder hier vulkan https://devdocs.io/vulkan/

Das ist aber alles nicht einfach, wie gesagt.

1

3D Engine und Texturen drauf ist nix Schweres. Wer nicht fit in Mathe ist muss sich da eben ein wenig einarbeiten. Kompliziert wird es wenn wir da Beleuchtung, Schatten, Partikel oder wenn wir das in Bezug auf Spiele sehen Physik reinbringen.

3D Vektoren darstellen, ne Kamera und Texturen drauf kriegt jemand der eine Programmiersprache beherrscht und sowas noch nie gemacht hat wohl in einigen Tagen hin.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

Tibor15 
Beitragsersteller
 21.01.2021, 09:35

Ok, aber auch von Anfang an? Ich müsste ja dann auch die jeweiligen Berechnungen für die Farbe der Pixel durchführen. Man lässt ja nicht nur die Objekte rotieren, was durch Mathematik gelöst wird, die ja nicht allzu kompliziert ist. Ich erstelle ja nicht Figuren mit Hilfe von Blender. Ihr meint also auch wenn man alles alleine macht wäre es nicht allzu schwer?

0
apachy  21.01.2021, 10:35
@Tibor15

Alles von Anfang an machst du eh nie alleine. Eine jeweilige Sprache bietet dir schon eine Menge an Funktionalität und auch da unter ist eine Menge schon fertig. Du implementierst ja auch kein Betriebssystem, einen Grafikkartentreiber, einen für das Filesystem, den Codec zur Interpretation der Texturen usw. Unter all den was du benutzt sind schon Millionen von Zeilen von Code, du arbeitest immer nur mit einer Abstraktionsschicht oben drauf.

Je nach Sprache kannst du entweder schon ganze Bilder bzw. Texturen nutzen, dafür zusätzliche Bibliotheken nutzen, die nix können als Bilder ausgeben oder auch Farbwerte von Pixeln auslesen und die selbstständig erneut malen.

Natürlich solltest du in der Sprache schon mal Bilder darstellen können. Das bringt aber fast jede Sprache mit, ansonsten gibt es kleine Libraries ala SDL für C oder die OOP Version davon.

0
Tibor15 
Beitragsersteller
 21.01.2021, 10:42
@apachy

Ok, hast du schon mal selbst eine Engine erstellt? Scheinst dich ja auszukennen.

0
apachy  21.01.2021, 10:58
@Tibor15

Ist nun nicht mein Fachgebiet aber habe schon mehrfach ein wenig mit so Themen rumgespielt in den Jahren. Habe zwar nie große fertige Spiele programmiert mit zig Leveln aber so kleine Testdinger in Richtung Pong, Space Shoot Em Ups, 2D Platformer mit Tile Scrolling, Pseudo 3D Kram (2,5D) ala Wolfenstein 3D oder auch richtige 3D Sachen, die dann eher zur Visualisierung von Lagern im beruflichen Umfeld oder eben auch die weiteren Themen ala Shading, Licht und Schatten usw. Das gut umsetzen ist dann deutlich komplizierter als ein Wireframe mit Texturen, das ist wie gesagt keine große Magie.

Ab wann wir etwas Engine nennen ist aber auch die Frage. Das hängt wohl immer vom Einsatzgebiet ab. Wir wissen ja nicht was du vorhast. Objekte darstellen ist kein Problem, ein komplex Spiel herstellen ist deutlich schwerer und inkl. Leveldesign, Grafiken, Models, Sounds usw. sicher was, wo Jahre rein gehen können. Eine komplette Engine, die flexibel erweiterbar ist ala Unity oder Unreal Engine in solcher Qualität wirst du als einzelner Mensch in deiner Lebenszeit nicht zu Ende kriegen.

0
belgisch  20.01.2021, 17:47

Genauso sehe ich das auch.

0

Wenn man weiß wie, ist das nicht allzu schwer. Problematisch dürfte mehr sein, dass das haufenweise Zeit in Anspruch nimmt.

Sehr komplex. Mussten das im Studium machen - nicht lustig. Als Übung gut, aber Du kannst es nur schlechter und langsamer machen, wenn Du eine eigene schreibst anstatt eine existierende, lang erprobte und optimierte zu nutzen,


Tibor15 
Beitragsersteller
 20.01.2021, 16:55

Wie war es? Habt ihr auch mit Drahtgittermodellen gearbeitet? Habt ihr auch die einzelnen Pixel angesteuert?

0
ohwehohach  20.01.2021, 16:58
@Tibor15

Drahtgittermodelle sind nur etwas für Leute, die sich Voxel nicht vorstellen können oder diese visualisieren müssen.

Und selbstverständlich haben wir einzelne Pixel angesteuert - aber nicht über die Grafikkarte direkt, sondern in einem gerenderten Bitmap.

Im Prinzip haben wir einen kleinen Raytracer mit fester Kameraposition gebaut. Aber völlig ohne Grafik-Engine wie OpenGL.

0
Tibor15 
Beitragsersteller
 20.01.2021, 16:59
@ohwehohach

Auf einer Skala von Null bis Zehn, wie schwer war es?

0
ohwehohach  20.01.2021, 17:04
@Tibor15

Für uns damals (allesamt gute Programmierer mit ausreichenden mathematischen Kenntnissen) unter der Maßgabe der Aufgabenstellung so etwa ne 7.

Mit meinen heutigen Kenntnissen? Gegeben den Funktionsumfang heutiger Game-Engines? Ganz klar eine 12 - alleine schon wegen des Zeitaufwandes.

0
jort93  20.01.2021, 17:11
@Tibor15

Das geht aber meines wissen nach auf modernen betriebsystemen garnicht, aus sicherheitsgründen(linux, windows, mac, überall nicht erlaubt).
Du kannst nicht direkt auf die hardware zugreifen ohne über den treiber und eine API wie openGL(was übrigens keine engine ist, sondern einfach nur eine API zum grafikkarten treiber) zu gehen.

Das wäre ein riesiges security problem.

Außer natürlich du schreibst nen eigenen grafikkarten treiber, aber das ist ja nochmal was anderes.

Was habt ihr da denn benutzt?

0
ohwehohach  20.01.2021, 18:13
@jort93
Was habt ihr da denn benutzt?

Wir? Damals tatsächlich Java. Es ging nicht um Speed, sondern darum, die Theorie mal in die Praxis umzusetzen. Im Prinzip ging es darum einen Raum zu programmieren, indem eine Lichtquelle hing mit texturierten Wänden und Böden, indem man sich drehen konnte.

Das als Vorbereitung auf JavaFX, wo wir dann ein einfaches Labyrinth-Spiel programmieren sollten (quasi so ähnlich wie ein 3D-Pacman). Das waren alles so "kleine Wochenübungen"... 🤣

Leider hab ich die Quellcodes von damals nicht mehr - wäre mal interessant, den mit den "heutigen Augen" zu sehen.

0
jort93  20.01.2021, 18:26
@ohwehohach

Wie gesagt, in normalen betriebsystemen geht das garnicht ohne APIs wie openGL oder DirectX zu nutzen. Man hat da keinen zugriff drauf.

In MS-DOS oder so geht sowas noch, aber in java wahrscheinlich dann auch eher nicht.

Ich denke mal ihr werdet da etwas benutzt haben was unter der haube OpenGL oder so verwendet.

0
jort93  20.01.2021, 18:30
@ohwehohach

JavaFX benutzt übrigens directX 11 ab windows 7, bei älteren windows versionen directX 9, auf linux und mac openGL, und als fallback gibts noch Java2D, das würde dann über die cpu komplett in software gerendert werden.

Um so eine API kommste nicht rum wenn du ne ordentliche 3d engine(oder auch 2d engine) schreiben willst.

0
ohwehohach  20.01.2021, 22:36
@jort93

Ich weiß das alles 😂 deswegen schrieb ich, dass wir bitmaps gerendert haben. Nein, wir haben im ersten Ansatz nichts mit Hardware Unterstützung genommen.

0
ohwehohach  20.01.2021, 22:38
@jort93
JavaFX benutzt übrigens directX 11 ab windows 7, bei älteren windows versionen directX 9, auf linux und mac openGL, und als fallback gibts noch Java2D, das würde dann über die cpu komplett in software gerendert werden.
Um so eine API kommste nicht rum wenn du ne ordentliche 3d engine(oder auch 2d engine) schreiben willst.

Auch das weiß ich, aber wie gesagt, unsere eigene Implementierung war ja der erste Schritt. Um vorher mal zu merken, wie schön es ist, wenn man eine vernünftige Engine verwenden kann.

0
jort93  20.01.2021, 23:07
@ohwehohach

Ah, also habt ihr das über die cpu gerendert?

Das kann man natürlich machen.

Aber wenn man eine grafikkarte benutzen will(wie es eine ordentliche 3d engine wohl tun würde), dann muss man eben eine API wie openGL nutzen.

0
ohwehohach  21.01.2021, 01:06
@jort93

Ja, es ging ja darum, selbst zu rendern inkl aller Geometrie und Beleuchtung. War echt langsam 😂Ist auch schon wieder fast 20 Jahre her...

0