Benutzer:Finalspace/Game Engine Design: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:
  
 
Von vornerein werde ich mich auf die sprache Lazarus/Freepascal festlegen.
 
Von vornerein werde ich mich auf die sprache Lazarus/Freepascal festlegen.
Die Gesamte Engine wird in dieser Sprache entwickelt und als eigene library
+
Der Gesamte Code wird darin entwickelt und folgendes Grundwissen wird für dieses Tutorial vorausgesetzt:
in jedes beliebiges Spiele Projekt integrierbar sein.
+
 
 +
- Entwicklung von UI Anwendungen mit Lazarus/Delphi (TForm, TApplication, Events)
 +
 
 +
- OOP Entwicklung (Klassen, Vererbung, Abstraktion, ...)
  
 
Der Renderer allerdings wird nicht festgelegt sondern Abstract gehalten,
 
Der Renderer allerdings wird nicht festgelegt sondern Abstract gehalten,
Zeile 10: Zeile 13:
 
Das klingt jetzt sehr gehoben und aufwendig, ist es aber nicht ;-)
 
Das klingt jetzt sehr gehoben und aufwendig, ist es aber nicht ;-)
 
Im gegenteil wir müsssen nicht alles von den jeweiligen API´s (OpenGL, Direct3D) unterstützen.
 
Im gegenteil wir müsssen nicht alles von den jeweiligen API´s (OpenGL, Direct3D) unterstützen.
Darauf werden wir aber noch detailierter eingehen.
+
Um das ganze einfacher zu machen, wird erstmal eine reine OpenGL Renderer API erstellt.
  
Die Gesamte Engine wird eine art Pluginsystem haben,
+
Die Gesamte Engine wird eine art Pluginsystem haben was integration von neuen Mesh/Grafik/... Formaten ermöglichen kann.
was integration von neuen Mesh/Grafik Formaten ermöglichen kann.
 
Wird ebenfalls noch erklärt.
 
  
 
Erstmal nun ein paar Grundsätzliche Denk Stützen:
 
Erstmal nun ein paar Grundsätzliche Denk Stützen:
  
 
- Was will ich erreichen
 
- Was will ich erreichen
 +
 +
  - Scene 1: Reine grafik
  
  Eine 3D Scene in einem TForm Control welches folgendes darstellt/kann:
+
    Eine 3D Scene in einem TForm Control welches folgendes darstellt/kann:
  
  - Eine simple map aus einfachen primitiven (Würfel, Sphere, Cylinder, Wände, Polygone, Teapot, Transparente Objekte)
+
    - Eine simple map aus einfachen primitiven (Würfel, Sphere, Cylinder, Wände, Polygone, Teapot, Transparente Objekte)
  - Die Scene soll eine Kamera enthalten in der man sich frei bewegen, entweder per toggling oder per mouse down/move.
+
    - Die Scene soll eine Kamera enthalten in der man sich frei bewegen, entweder per toggling oder per mouse down/move.
  - Es soll von folgenden Lichttypen jeweils 3 enthalten sein: Point / Spot / Directional.
+
    - Es soll alle arten von Lichttypen enthalten: Point / Spot / Directional.
  - Das licht wird per Pixel berechnet, somit müssen die Licht Operationen im Shader geschrieben sein.
+
    - Das licht wird per Pixel berechnet, somit müssen die Licht Operationen im Shader geschrieben sein.
     Es reicht aber normales Licht ohne Special Effekte wie Bumpmapping...
+
     - Jedes Licht soll natürlich auch auf die Objekte Schatten werfen (Shadow maps).
  - Jedes Licht soll natürlich auch auf die Objekte Schatten werfen (Shadow maps).
+
    - Jedes Licht muss ein/ausschaltbar/einstellbar sein per TForm GUI.
  - Jedes Licht muss ein/ausschaltbar/einstellbar sein per TForm GUI.
+
    - Jedes Licht hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Cast shadow)
  - Jedes Licht hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Cast shadow)
+
    - Jedes Objekt in der Scene hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Receive shadow)
  - Jedes Objekt in der Scene hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Receive shadow)
+
    - Das Rendering erfolgt komplett über deferred rendering.
  - Das Rendering erfolgt komplett über deferred rendering.
+
    - Es soll auch ein paar Post-Processing effekte ein/ausgeschaltet werden können wie z.b. Tone-Mapping, Depth-Of-Field.
  - Eventuell wird es noch einen seperaten forward renderer geben.
 
  - Es soll auch ein paar Post-Processing effekte ein/ausgeschaltet werden können wie z.b.
 
    Tone-Mapping, Depth-Of-Field.
 
  
 
- Was brauch ich dazu (Grob in stichwörtern beschrieben, unsortiert)
 
- Was brauch ich dazu (Grob in stichwörtern beschrieben, unsortiert)
  
   - Mesh
+
   Für Scene 1:
  - Texture
+
 
  - Material
+
    - Mesh
  - Shader
+
    - Texture
  - Object
+
    - Material
  - Kamera  
+
    - Shader
  - Renderer
+
    - Object
  - Image
+
    - Camera  
  - Render buffer / Render to texture
+
    - Renderer
  - Scene graph
+
    - Image
   - Octree
+
    - Vertex/Index buffer
   - Plugin
+
    - Depth buffer
 +
    - Color buffer
 +
    - Render buffer (Render to texture)
 +
    - Scene graph
 +
    - Plugin
 +
    - Vector
 +
    - Matrix
 +
    - Frustum
 +
    - AABB/BB
 +
    - Math-Library
 +
    - Resource Manager
 +
 
 +
   Für Scene 2 (Zusätzlich zu scene 1):
 +
 
 +
    - Octree
 +
    - Collisionserkennung
 +
 
 +
- Das ganze wird schritt für schritt aufgebaut, das ergebnis von oben soll sequentiell realisiert werden.
 +
 
 +
   1. Wir erzeugen einen Blue-Screen :D
 +
 
 +
  1.1 Projekt erzeugen
 +
 
 +
  1.2 Die Renderer Klasse erstellen

Aktuelle Version vom 10. Februar 2010, 16:15 Uhr

Dies wird ein Versuch ein Tutorial zu erstellen, zur Entwicklung einer Game Engine.

Von vornerein werde ich mich auf die sprache Lazarus/Freepascal festlegen. Der Gesamte Code wird darin entwickelt und folgendes Grundwissen wird für dieses Tutorial vorausgesetzt:

- Entwicklung von UI Anwendungen mit Lazarus/Delphi (TForm, TApplication, Events)

- OOP Entwicklung (Klassen, Vererbung, Abstraktion, ...)

Der Renderer allerdings wird nicht festgelegt sondern Abstract gehalten, das bedeutet das Grafik API befehle ausgelagert sind und pro API eine library existiert die gewechselt werden kann.

Das klingt jetzt sehr gehoben und aufwendig, ist es aber nicht ;-) Im gegenteil wir müsssen nicht alles von den jeweiligen API´s (OpenGL, Direct3D) unterstützen. Um das ganze einfacher zu machen, wird erstmal eine reine OpenGL Renderer API erstellt.

Die Gesamte Engine wird eine art Pluginsystem haben was integration von neuen Mesh/Grafik/... Formaten ermöglichen kann.

Erstmal nun ein paar Grundsätzliche Denk Stützen:

- Was will ich erreichen

 - Scene 1: Reine grafik
   Eine 3D Scene in einem TForm Control welches folgendes darstellt/kann:
   - Eine simple map aus einfachen primitiven (Würfel, Sphere, Cylinder, Wände, Polygone, Teapot, Transparente Objekte)
   - Die Scene soll eine Kamera enthalten in der man sich frei bewegen, entweder per toggling oder per mouse down/move.
   - Es soll alle arten von Lichttypen enthalten: Point / Spot / Directional.
   - Das licht wird per Pixel berechnet, somit müssen die Licht Operationen im Shader geschrieben sein.
   - Jedes Licht soll natürlich auch auf die Objekte Schatten werfen (Shadow maps).
   - Jedes Licht muss ein/ausschaltbar/einstellbar sein per TForm GUI.
   - Jedes Licht hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Cast shadow)
   - Jedes Objekt in der Scene hat eine Eigenschaft in der man die Schatten ein/ausschalten kann. (Receive shadow)
   - Das Rendering erfolgt komplett über deferred rendering.
   - Es soll auch ein paar Post-Processing effekte ein/ausgeschaltet werden können wie z.b. Tone-Mapping, Depth-Of-Field.

- Was brauch ich dazu (Grob in stichwörtern beschrieben, unsortiert)

 Für Scene 1:
   - Mesh
   - Texture
   - Material
   - Shader
   - Object
   - Camera  
   - Renderer
   - Image
   - Vertex/Index buffer
   - Depth buffer
   - Color buffer
   - Render buffer (Render to texture)
   - Scene graph
   - Plugin
   - Vector
   - Matrix
   - Frustum
   - AABB/BB
   - Math-Library
   - Resource Manager
 Für Scene 2 (Zusätzlich zu scene 1):
   - Octree
   - Collisionserkennung

- Das ganze wird schritt für schritt aufgebaut, das ergebnis von oben soll sequentiell realisiert werden.

 1. Wir erzeugen einen Blue-Screen :D
 1.1 Projekt erzeugen
 1.2 Die Renderer Klasse erstellen