Posts mit dem Label OpenGL Tutorials werden angezeigt. Alle Posts anzeigen
Posts mit dem Label OpenGL Tutorials werden angezeigt. Alle Posts anzeigen

Prozedurale Terrain-Generierung und -Darstellung (Demoprogramm)

Die Terrain-Generierung und -Darstellung zählt zu den interessantesten aber auch anspruchsvollsten Themenkomplexen im Bereich der Spieleprogrammierung. Das hier vorliegende Beispielprogramm soll Ihnen als Einstiegshilfe dienen und demonstriert in diesem Zusammenhang den Einsatz von OpenGL-Texture-Buffer- und Texture-Array-Objekten bei der Darstellung von virtuellen Landschaften, die aus einer großen Anzahl von Terrain-Tiles zusammengesetzt sind (Texture Buffer Instancing).

Angefangen beim einfachen 2D-Terrain bis hin zum deutlich komplexeren 3D-LOD-Terrain mit Texture Splatting unterstützt das Programm die folgenden vier Render-Techniken (letzter Eintrag in der Datei DemoConfig.txt im Ordner Bin):
  • Einfaches 2D-Terrain (0)
  • Einfaches 2D-Terrain mit Texture Splatting (1)
  • Einfaches 3D-Terrain mit Texture Splatting (2)
  • 3D-LOD-Terrain mit Texture Splatting (3)





    Die Terrain-Generierung (3D-LOD-Terrain) erfolgt skriptbasiert (siehe LODTerrainGenerationDesc.txt im Ordner Terrains), wobei die folgenden prozeduralen Techniken miteinander kombiniert werden können:


    • Diamond Square
    • Cell Noise (Voronoi)
    • Perlin Noise
    • Square Value Noise
    • Definition einzelner Hügel/Berge/flacher Flächen
    • Erosion
    • Digitale Filterung
    • Höhen- bzw. Steigungsabhängige Texturierung
    • usw.

    OpenGL Tutorial (Version 3.3) – Skelett-Animation und Geometry Instancing mithilfe von Uniform-Buffer-Objekten (Download)

    Im heutigen OpenGL-Tutorial befassen wir uns zum wiederholten Male mit der Skelett-Animation (Vertex Skinning) von 3D-Modellen. Im Unterschied zu den früheren Beispielen kommen bei der Animation nun zwei Uniform-Buffer-Objekte zum Einsatz. Im ersten Buffer werden wie gehabt die Transformationsmatrizen der aktuellen Animationspose gespeichert. Der zweite Buffer wird benötigt, um die Orientierungsmatrizen der einzelnen Instanzen zu verwalten.




    OpenGL Tutorial (Version 3.3) – Gemometry Instancing, Handhabung der Objekt-Instanzen (Download)

    Im heutigen OpenGL-Tutorial dreht sich wieder einmal alles um das Thema Geometry Instancing. Ziel ist die Darstellung einer beliebig großen Anzahl von 3D-Objekten, die sich zur Laufzeit dynamisch initialisieren bzw. zerstören lassen. Für die Handhabung dieser Objekte ist die CSimpleObjectInstanceMemoryManager-Klasse verantwortlich, für die Bereitstellung aller für die Darstellung benötigten Texturen und Mesh-Daten die CInstancedObjectTextureAndMeshDesc-Klasse.


    OpenGL Tutorial (Version 3.3) – Background Rendering (Download)

    Im heutigen Tutorial befassen wir uns mit den grundlegenden Techniken des Background Renderings – mit der Verwendung von Background Boxen, -Sphären, -Domen sowie Billboards.
    In Szene 1 wird eine weitläufige Wüstenlandschaft mithilfe einer einfachen Sky Box dargestellt.
    In Szene 2 werden gleich mehrere Techniken für die Weltraum-Hintergrundgestaltung (eine Background Box für die Darstellung der Hintergrundsterne, eine Background-Sphäre für die Darstellung weiträumiger stellarer Nebelgebiete sowie diverse Background-Billboards für die Darstellung von kleineren stellaren Gaswolken, Galaxien und wichtigen Sternen) miteinander kombiniert.





    OpenGL Tutorial (Version 3.3) – Screen Space Ambient Occlusion (SSAO) (Download)

    Im heutigen OpenGL Tutorial befassen wir uns mit der Implementierung zweier Screen Space Ambient Occlusion Techniken. Die ersten zwei Screenshots zeigen den Effekt des klassischen SSAO (Distance Based Occlusion), Screenshot 3 demonstriert eine gänzlich anderes Verfahren (Surface Height Occlusion).

    Screen Space Ambient Occlusion (Umgebungsverdeckung) gehört in modernen Computerspielen mittlerweile zu den Standardtechniken, die im Rahmen des Post Processings zum Einsatz kommen. Es handelt sich um ein rein empirisches Modell, welches auf der alltäglichen Beobachtung basiert, dass Flächen bzw. Szenenpixel, die in geringem Abstand von anderen Flächen umgeben sind, dunkler erscheinen als freiliegende Flächen. Der Grund ist einfach – umliegende Flächen bzw. Szenenpixel blockieren teilweise die Einstrahlung des ambienten Lichts. Im Gegensatz dazu trifft bei freiliegenden Flächen das ambiente Licht ungehindert aus allen Richtungen auf.


    Distance Based Occlusion: Für jedes Szenenpixel wird überprüft, ob benachbarte Szenenpixel (Occluder) den ambienten Lichteinfall blockieren. Hierbei behindern Occluder mit geringem Abstand zum Szenenpixel den Lichteinfall stärker als Occluder mit größerem Abstand. Je mehr Richtungen dabei berücksichtigt werden, umso besser ist das sichtbare Resultat.





    Surface Height Occlusion: Anhand der in der Normal Map gespeicherten Höhenwerte wird in Abhängigkeit von der momentanen Blickrichtung die Umgebungsverdeckung sowie ein dreidimensionaler Oberflächen-Effekt berechnet.


    OpenGL Tutorial (Version 3.3) – Deferred Water Rendering / Screen Space Water (Download)

    Im heutigen OpenGL Tutorial werden wir uns mit der Darstellung von Wasser-Effekten befassen. Im Gegensatz zu den allgemein etablierten Techniken bei der Wasserdarstellung werden wir jedoch einen gänzlich anderen Weg einstellen – die Animation der 3D-Wasserwellen erfolgt im Rahmen des Post Processings ohne Verwendung zusätzlicher Vertexdaten zur Modellierung der Wasseroberfläche (Deferred Water Rendering bzw. Screen Space Water).
    Features:

    • 3D-Wellenanimation
    • Echtzeit-Reflektionen und Refraktionen der Umgebung
    • spiegelnde Reflektion einer direktionalen Lichtquelle
    • Schaumkronen auf den Wellen und im Flachwasser-Bereich
    • erweitertesVolumetric Light Scattering
    • wahlweise HDR- oder LDR-Rendering

    Alle für die Wasserdarstellung benötigten Render-Parameter finden sich in der Konfigurationsdatei ResolutionAndRendering.txt. Zuständig für die Wasserdarstellung ist der Fragment Shader ScreenSpaceWaterSurface.frag, welcher im Verzeichnis Bin/Shader/ zu finden ist.


    OpenGL Tutorial (Version 3.3) – Volumetric Light Scattering (Download)

    Im heutigen OpenGL Tutorial werden wir uns mit der Darstellung von Light-Scattering-Effekten (auch bekannt Light Shafts oder God Rays) befassen. Physikalisch betrachtet handelt es sich dabei um Streuprozesse, bei denen Lichtstrahlen an Wassertropfen in der Atmosphäre oder an Schmutzpartikeln (Staub, Rauch, etc.) in Richtung des Beobachters abgelenkt werden. Obgleich eine physikalisch korrekte Simulation viel zu aufwändig wäre, ist die Realisierung dieses Effekts im Rahmen den Post-Processings erstaunlich einfach:


    • Man ermittelt für jedes Szenenpixel die Richtung zur Lichtquelle im Bildraum
    • Man unterteilt den Abstand des Szenenpixels zur Lichtquelle (Lichtweg) in gleichmäßige Bereiche (Samples)
    • Man überprüft, ob der Lichtweg in den einzelnen Bereichen durch irgendwelche Hindernisse (3D-Modelle, Szenengeometrie) blockiert wird
    • Sollte der Lichtweg nicht blockiert sein, dann addiert man die Helligkeit im betreffenden Bereich zur Gesamthelligkeit des Szenenpixels

    Resultat: Im Ergebnis erscheinen blockierte Lichtwege dunkler, wodurch sich Schattenräume ausbilden.


    OpenGL Tutorial (Version 3.3) – Deferred Lighting (Download)

    In den bisherigen OpenGL-Tutorials erfolgte die Beleuchtung der 3D-Objekte immer zeitgleich mit dem Rendering (Forward Rendering). In modernen 3D-Engines jedoch werden die Beleuchtungsberechnungen zunehmend getrennt vom eigentlichen Rendering im Rahmen des Post-Processings durchgeführt (Deferred Lighting).
     



    Vorteile des Deferred Lightings:

    • Der Rechenaufwand für die Beleuchtung ist unabhängig von der Komplexität der Szenen-Geometrie
    • Es lassen sich deutlich mehr Lichtquellen berücksichtigen als beim Forward Rendering
    • Die im Rahmen des Deferred Lightings benötigten Szeneninformationen lassen sich auch im Rahmen weiterer Post-Prozessing-Effekte verwenden (Bsp. Screen Space Ambient Occlusion)

    Mit dem heutigen Tutorial werden wir nun ebenfalls die Beleuchtungsberechnungen im Rahmen des Post-Processings durchführen. Zuständig für die Berechnungen ist der Fragment Shader ScreenSpaceLighting.frag, welcher im Verzeichnis Bin/Shader/ zu finden ist.

    Die für die Beleuchtung benötigten geometrischen Informationen müssen zuvor in die nachfolgenden Texturen gerendert werden, die allesamt an einen als G-Buffer (Geometry Buffer) bezeichneten Framebuffer gebunden sind:

    • Textur 1: Kameraraum-Positionen und Tiefenwerte der sichtbaren Szenenpixel
    • Textur 2: Kameraraum-Normalen der sichtbaren Szenenpixel
    • Textur 3: Die texturierten, jedoch nicht beleuchteten sichtbaren Szenenpixel
    • Textur 4: Reflektionsvermögen (Farbe und Intensität) der sichtbaren Szenenpixel
    • Textur 5: selbstleuchtende Szenenpixel (Bsp. mittels Light Map beleuchtet)

    OpenGL Tutorial (Version 3.3) – Managed Instancing (Download)

    Das heutige OpenGL-Tutorial behandelt das Thema „Managed Instancing“. Bisher musste für jedes sichtbare Objekt die passende Render-Funktion direkt aufgerufen werden. Nun übernimmt ein Rendering-Manager das Handling der darzustellenden Objekte und ermöglicht so den den Einsatz von Geometry Instancing beim Rendern der einzelnen Teile (Modelparts, Submeshes) eines 3D-Modells. Das nachfolgende Schema zeigt, wie sich dadurch die Zahl der notwendigen Draw Calls reduzieren lässt:



    Draw Call Schema:

    • Draw Call 1: Modelpart 1 (Instance 1, Instance 2, Instance 3, usw.)
    • Draw Call 2: Modelpart 2 (Instance 1, Instance 2, Instance 3, usw.)
    • Draw Call 3: Modelpart 3 (Instance 1, Instance 2, Instance 3, usw.)
    • usw. (für alle Teile eines 3D-Modells)

    OpenGL Tutorial (Version 3.3) – Partikelsysteme (Download)


    Im heutigen OpenGL-Tutorial werden wir uns mit der Implementierung eines Partikelsystems befassen. Um die Anzahl der notwendigen Draw Calls auf ein Minimum zu reduzieren, werden die Partikel mittels Geometry Instancing unter Verwendung eines Uniform-Buffer-Objekts gerendert.

    OpenGL Tutorial (Version 3.3) – Textur-Effekte (Download)


    Im heutigen OpenGL-Tutorial werden wir uns mit der Darstellung von verschiedenen Textur-Effekten befassen. Zum Abspeichern dieser Effekte verwenden wir wiederum eine eigens definierte Skript-Datei.









    OpenGL Tutorial (Version 3.3) – Texturen und Meshes dynamisch im Hintergrund laden und entladen (Download)


    Im heutigen OpenGL-Tutorial werden wir uns damit befassen, wie sich Texturen und Meshes zur Laufzeit dynamisch im Hintergrund laden und entladen lassen.

    OpenGL Tutorial (Version 3.3) – Animation Scripts (Download)

    Im heutigen OpenGL-Tutorial werden wir die einzelnen Teile unserer 3D-Modelle gezielt animieren und dabei die einzelnen Animationsschritte in einer zusätzlichen Skript-Datei abspeichern.

    X-File-Modell-Konverter Version 2 (Download)


    Mithilfe der zweiten Version des X-File-Modell-Konverters lässt sich für ein konvertiertes x-Modell zusätzlich ein auf Bounding-Sphären basiertes Kollisionsmodell generieren.

    OpenGL Tutorial (Version 3.3) – Bounding-Sphären-Kollisionsmodelle (Download)

    Im heutigen OpenGL-Tutorial versehen wir unsere 3D-Modelle mit einem Bounding-Sphären-Kollisionsmodell, welches sich mit der zweiten Version unseres X-File-Modell-Konverters in der gewünschten Genauigkeit generieren lassen wird.








    OpenGL Tutorial (Version 3.3) – Entwurf eines 3D-Modellformats für den Einsatz beim Geometry Instancing (Download)

    Im heutigen OpenGL-Tutorial wird ein zweites Modellformat vorgestellt, das speziell für den Einsatz beim Geometry Instancing konzipiert wurde. Den einzelnen Instanzen (bzw. Model Parts) wird die ID eines Texture Sets (Surface Map, Normal Map, Specular Map und Light Map) zugeordnet, mit deren Hilfe im Fragment Shader auf die korrekten Texturen zugegriffen werden kann. Im Unterschied zum zuvor besprochenen Modellformat ist es nun möglich, die einzelnen Instanzen mit verschiedenen Texturen zu rendern.

    OpenGL Tutorial (Version 3.3) – Renderlisten (Download)

    Im Rahmen des heutigen OpenGL-Tutorials erweitern wir unser Modellformat um sogenannte Renderlisten. Mithilfe von Renderlisten lassen sich komplexere 3D-Modelle und -Szenarien deutlich effizienter darstellen (Anzahl der Textur-Wechsel wird minimiert, Anzahl der Vertexbuffer- und Indexbuffer-Wechsel wird minimiert, Geometry Instancing).

    X-File-Modell-Konverter Version 1 (Download)

    Im vorherigen OpenGL-Tutorial haben wir mit dem Entwurf eines eigenen 3D-Modellformats begonnen. Bei dem dargestellten Raumschiff-Modell handelt es sich um ein konvertiertes x-Modell (von DirectX verwendetes Modellformat). Das für die Konvertierung verwendete Programm steht ab heute in seiner ersten Version zum Download bereit.

    OpenGL Tutorial (Version 3.3) – Entwurf eines 3D-Modellformats (Download)

    Im Rahmen des heutigen OpenGL-Tutorials befassen wir uns mit dem ersten Entwurf eines eigenen 3D-Modellformats.

    In den kommenden Tutorials werden wir den Entwurf dann schrittweise weiterentwickeln (Animation einzelner Modellteile, Kollisionsmodell, usw.).

    OpenGL Tutorial (Version 3.3) – Instanced Vertex Skinning + Uniform Buffer Objekte (Download)

    Im heutigen OpenGL-Tutorial verwenden wir Uniform Buffer Objekte nicht nur für das Geometry Instancing sondern nutzen sie zudem für die Skelett-Animation (Vertex Skinning) von 3D-Modellen. Dargestellt werden acht zum Laufen animierte Spielfiguren. Alle acht Instanzen werden in der gleichen Animationspose gerendert.