LU Computergraphik 2 SS 4.0, 186.165

Michael Wimmer


 

Aufgabendefinition

Im 3. Abschnitt geht es darum, die Spiellogik und das Spieldesign zu verfeinern, die Komplexität der Objekte und der Szene zu steigern und einige fortgeschrittene Techniken bzw. Spezialeffekte der Echtzeitgraphik anzuwenden. Dabei können und sollen durchaus auch erweiterte Funktionen der 3D-Hardware (wie z.B. Alpha-Blending, Stencil-Buffering oder etwa Bump-Mapping) ausgenutzt werden.

In der folgenden Aufzählung seht ihr die Anforderungen, die euer Spiel erfüllen soll. Außerdem gibt es danach eine Liste von möglichen Spezialeffekten, von denen einige in eurem Spiel vorkommen sollten.

Benotungsschema

Insgesamt gibt es für die 3. Abgabe 70 (von insgesamt 100) Punkten. Die Bewertung setzt sich aus folgenden Kriterien zusammen:

  • Gameplay (20 Punkte)
  • Effekte, siehe Effektliste (20)
  • Animierte Objekte (10)
  • Frustum Culling (5)
  • Experimentieren mit OpenGL Buffer-Objects: VBOs und eines von VAO, FBO oder UBO (5)
  • Experimentieren mit OpenGL: Wireframe Modus / Framerate und andere Debug Ausgaben (5)
  • Funktionierende Steuerung (5)

Zusätzlich muss eine Dokumentation abgegeben werden und weiters ist es wichtig, dass ihr alle Kriterien der 2. Abgabe erfüllt (falls noch etwas gefehlt hat). Im Folgenden findet ihr eine detailliertere Beschreibung sowie einige Tipps und Hinweise zur Umsetzung.

Entwicklungsschritte - Anforderungen

Gameplay

In diesem Abschnitt solltet ihr darauf achten, dass euer Spiel auch wirklich spielbar ist (man sollte also zum Beispiel in einem Dungeon nicht durch die Wände gehen können). Eine reine "Game-Engine" ist wie schon bei der 2. Abgabe zuwenig - der Spielspaß und das Spieldesign gehen hier jedoch noch deutlicher in die Bewertung ein!

Nichttriviale Objekte

Im Spiel müssen einige nichttriviale Objekte vorkommen, das heißt konkret, Objekte, die nicht wie Würfel, Kugeln, Kegel oder ähnliches durch ein oder zwei Befehle generiert werden können. Speziell müssen auch nichtkonvexe Objekte vorkommen, sowie Objekte mit gekrümmter Oberfläche (also solche, bei denen Gouraud Shading den Eindruck einer Oberflächenkrümmung erweckt).

Dafür macht es natürlich Sinn, sich ein Objektdateiformat zu überlegen und eine Einleseroutine dafür zu programmieren. Alternativ könnt ihr auch diverse im Internet verfügbare Einleseroutinen für bekannte Datenformate (wie .obj oder ähnliches) in euer Programm einbinden und auch solche Programme zur Modellierung eurer Objekte verwenden. Aber Vorsicht bei Modellen, die ihr evtl. vom Netz herunterladet: solche Modelle haben meistens sehr viele Dreiecke (verschwenden also euer Polygonbudget) und sind außerdem oft nicht für die Anzeige mit OpenGL geeignet - z.B. sind die Normalvektoren falsch definiert, oder die Objekte haben Löcher an einigen Stellen.

Animierte Objekte

Während sich bei der 2. Abgabe die Objekte nur bewegen mussten und selbst nicht animiert waren, wären nun animierte Ojekte wünschenswert. Es ist ausreichend, wenn die Objekte hierachisch animiert werden (z.B. Rotation eines Kopfes auf einem Körper) aber natürlich stehen euch auch hier alle anderen Möglichkeiten (Skeletal Animation etc.) frei.

Beschleunigung der Sichtbarkeitsberechnung

View-Frustum-Culling von Objekt-Boundingboxen oder Bounding-Spheres sollte implementieren werden (auch wenn das bei eurem Rechner nicht notwendig wäre). Der dadurch entstandene Performance Gewinn sollte durch Debug Ausgaben (siehe unten) sichtbar gemacht werden.

Transparenz-Effekte

An geeigneten Stellen sollten Effekte mit Hilfe des Alpha-Kanals erzielt werden. Dafür gibt es viele Möglichkeiten: Fenster etwa können teilweise transparent sein, genauso wie Cockpits von anderen Raumschiffen. Oder aber man verwendet den Alpha-Test, um nur bestimmte Teile einer Textur darzustellen (z.B. eine Gitter-Textur). Beachtet, dass man für eine richtige Darstellung von transparenten Objekten diese nach ihrer Entfernung zum Betrachter sortieren muss, falls Alpha-Werte ungleich 0 und 1 vorkommen (siehe dazu beim entsprechenden Punkt bei den Spezialeffekten).

Experimentieren mit OpenGL

Darunter verstehen wir, dass einige erweiterte Möglichkeiten von OpenGL implementiert bzw. getestet werden sollen. Die Funktionen, die getestet werden sollen, sind:

  • Vertex-Buffer-Objects (VBO)
  • Buffer-Objects: Eines von VAO (Vertex Array Objects), FBO (Frame Buffer Object) oder UBO (Uniform Buffer Object)
  • Mip Mapping (ein/aus)
  • Textur-Qualitätseinstellungen (Bi/Trilineare Filterung)

Diese Funktionen sollen so implementiert werden, dass man sie per Knopfdruck ein- oder ausschalten kann (bzw. umschalten bei der Texturqualität). Die Auswirkung auf die Bildqualität bzw. die Darstellungsqualität kann man dann direkt begutachten.

Um Beschleunigungseffekte messen zu können, soll das Spiel auch die Möglichkeit bieten, die aktuelle Framerate (Bilder pro Sekunde) anzuzeigen.

Damit man die Komplexität der Objekte begutachten kann, soll auch ein Wireframe-Mode (also Liniengrafik) implementiert werden (Tip: das lässt sich mit einem einzigen OpenGL-Befehl erreichen!)

Um uns das Testen zu erleichtern, verwendet bitte folgende Funktionstasten:

F1 - Hilfe (falls vorhanden)
F2 - Framerateanzeige ein/aus
F3 - Wire Frame ein/aus
F4 - Texturqualität verändern: Nearest Neighbor/Bilinear
F5 - MipMapping-Qualität ändern: Aus/Nearest Neighbor/Linear
F6 - Vertex Arrays vs. Vertex Buffer Objects
F7 - -
F8 - Viewfrustum-Culling ein/aus
F9 - Transparenz ein/aus.

Die durchgeführte Änderung sollte auch durch einen kurz am Bildschirm eingeblendeten Text bestätigt werden.

Restriktionen

Lest euch den Punkt Restriktionen auf der Inhalts-Seite durch, um sicherzugehen, dass alle Zusatztools, die ihr verwenden wollt, auch bei der Übung erlaubt sind!

Effekte

In eurem Spiel muss eine Reihe an fortgeschrittenen computergraphischen Effekten implementiert werden. Diese Effekte bringen euch je nach Implementationsaufwand eine unterschiedliche Anzahl an Richtpunkten. Für manche Effekte gibt es eine "kleinere" und "größere" Variante, die davon abhängt wie einzelne Teile des Effekts berechnet werden. Pro Gruppenmitglied müsst ihr Effekte im Wert von 2 Richtpunkten umsetzen.

Hinweis: Diese Richtpunkte dienen nur dazu die Komplexität eines Effekts zu klassifizieren und wirken sich nicht unmittelbar auf die Punkte aus, die ihr bei der Benotung für "Effekte" bekommt.

Wir haben euch eine Liste an häufig eingesetzten Effekten zusammengestellt. Wenn ihr eigene Ideen habt dann informiert uns in eurem Designdokument der 1. Abgabe darüber und fragt die Tutoren im Informatikforum.

Beleuchtung/Schatten:

Effekt Punkte Beschreibung
Projective Texture Shadows 2 Schatten, die Objekte auf den Boden werfen sollen, werden über Render-to-Texture projiziert in eine Schwarz-Weiß-Textur gerendert und dann benutzt um die Umgebungsgeometrie abzudunkeln.
Shadow Maps 3 Direktionale oder omnidirektionale Shadow Maps mit Self Shadowing auf den Objekten.
Shadow Volumes 3 Shadow Volumes mit zfail-Technik und Self Shadowing auf den Objekten.
Lightmaps 1 Wenn ihr die Lightmaps selbst berechnet (also nicht z.B. mit Radiant) bekommt ihr 2 Extrapunkte.
Spotlights/projizierte Texturen 2 Eine dynamische Textur die mit projektivem Texturing auf Geometrie aufgebracht wird.

Visibility/Level of Detail:

Effekt Punkte Beschreibung
Statische Levels of Detail für Modelle 1 Mehrere Levels of Detail pro Modell. Dabei kann es sich um Geometrie- oder Shader-LOD handeln.
Levels of Detail für Terrain 2 Euer Terrain ist in einzelne Blöcke unterteilt die je nach Entfernung zur Kamera in unterschiedlicher Detailstufe gerendert werden. Dabei ist es wichtig die Übergänge zwischen diesen Blöcken seamless und ohne T-Vertices zu gestalten.
Quadtree/Octree/KD-Tree 2 Unterteilung des 3D-Raums in hierarchischen Strukturen. Bewegliche Objekte müssen dabei von einer Zelle des Baums in eine andere wandern können.
BSP-Tree 1 Wenn die BSP-Struktur selbst berechnet wird und nicht mit Tools wie Radiant bekommt ihr 1 Extrapunkt.
Portal Rendering 2 Unterteilung des 3D-Raums in Bereiche die über Portale miteinander verbunden sind.

Oberflächeneffekte:

Effekt Punkte Beschreibung
Environment Mapping 1 Sphere- oder Cube Mapping auf beweglichen Objekten. Wenn die Environment Map jeden Frame upgedatet wird bekommt ihr 1 Extrapunkt
Normal/Parallax Mapping 3 Normal Mapping, bei dem ihr den Tangent Space selber berechnet. Dieser Effekt zählt nur wenn er auf komplexen Objekten aufgebracht ist und nicht auf axis-aligned Quads oder Boxen!
Kaustiken 1 Ein Lichtbrechungseffekt unter Wasser, der als animierte Texturschicht über die normale Oberflächentextur geblendet wird. Wenn ihr die Kaustiken-Textur selbst dynamisch jeden Frame neu generiert bekommt ihr 1 Extrapunkt
Cartoon Shading 2 Über eine 1D-Textur wird abhängig von der Beleuchtungssituation die Helligkeit eurer Objekte moduliert. Außerdem werden die Objekte mit Outlines gerendert.

Screen Space-Effekte:

Effekt Punkte Beschreibung
Lens Flares 1 Blendeneffekte die Lichtquellen verstärken. Der Effekt wird nur gerendert wenn die Lichtquelle von der Kamera aus sichtbar ist.
Bloom 1 Helle Regionen des Bildes überstrahlen dünklere Bereiche. Das Glühen wird über ein eigenes Rendertarget gelöst welches weichgezeichnet wird.
Motion Blur 2 Bewegungsunschärfe, diese wird über bluren in Bewegungsrichtung der Objekte gelöst. (Simples verwenden des Accumulationbuffers ist nicht ausreichend!).
Depth of Field 2 Simuliert die Tiefenunschärfe einer Kamera. Beinhaltet das rendern der Szene in eine Tiefentextur um das Bild danach dementsprechend weich zu zeichnen.
Lightshafts 1 Erzeugt athmosphärischen Lichteinfall der Sonne durch die Luft. Werden erzeugt durch einfaches Berechnen von Lightrays ausgehend von der Sonne im Screenspace.
HDR 2 Rendern der Beleuchtungsinformation in einen Float-Buffer und Tone Mapping. Wenn sich die Belichtung adaptiv ändert bekommt ihr 1 Extrapunkt.
Screen Space AO 2 Tiefenwerte und Normalen für jeden Pixel im Framebuffer werden herangezogen um lokale konkave Ecken in der Szene-Geometrie zu finden und abzudunkeln.
Andere Effekte ? Wenn ihr andere Ideen oder Vorschläge für Screenspace-Effekte habt fragt bitte im Forum nach.

Diverses:

Effekt Punkte Beschreibung
Partikelsystem 1 Rauch, Feuer, Explosionen...
Wasser 1 Sich dynamisch ändernde Wellen-Geometrie und eine Texturanimation.
Vertex Skinning 1 Eine komplette Bonestruktur wird aus einem Model File geladen und über weighted Indices dem Model zugewiesen. Geschieht die Interpolation auf der GPU in einem Vertexshader gibt es einen Zusatzpunkt.

Volle Punkte für die Effekte können wir euch nur geben wenn die Effekte korrekt implementiert wurden. Außerdem müssen sie deutlich sichtbar und sinnvoll eingesetzt sein. Was beispielsweise nicht zählen würde wäre Normal Mapping mit einer rein statischen Beleuchtung, da man hier die Beleuchtungsinformation genauso gut in Texturen vorberechnen könnte. Effekte die wir nicht sehen, können wir auch nicht bewerten!

Gebt in der Dokumentation eures Programms an wo im Spiel die Effekte auffindbar sind und wie ihr sie technisch implementiert habt. Gebt außerdem die Quellen an, anhand derer ihr die Effekte implementiert habt!

Abgabe und Dokumentation

Für die Abgabe geht wieder wie in "Bewertung und Benotung" beschrieben vor.

Wichtig: Bei dieser Abgabe ist es besonders wichtig, genau zu dokumentierten, was ihr implementiert/verwendet habt (ein 1-seitiges Readme-File reicht nicht aus)! Neben den in "Bewertung und Benotung" erwähnten Punkten sollte folgendes vorkommen:

  • Kurze Beschreibung, wie die einzelnen Punkte der Angabe (siehe oben) umgesetzt wurden.
  • Welche Spezialeffekte wurden implementiert?
  • Wie wurden die Spezialeffekte implementiert (genauer(!) Link/Referenz auf Paper, Buch oder andere Resource, wo der Spezialeffekt beschrieben ist, und Beschreibung Eurer Erweiterungen dazu).
  • Welche sonstige Besonderheiten hat das Spiel (Loader, ...)?
  • Welche Zusatztools wurden verwendet (andere libraries wie SDL, GLFW, Collision-Detection-Libraries, Sound-Libraries, Mesh-Loader, ...), wieder mit genauer(!) Quellenangabe (URL) (siehe auch Restriktionen)?
  • Mit welchen Tools wurden die Objekte modelliert (Maya, 3DS MAX, händisch)?
  • Bei Spielen mit komplexeren Interaktionsfolgen (das kann schon allein das Öffnen einer Tür im Spiel sein :-), inkludiert bitte auch eine Schritt-für-Schritt-Anleitung, wie man durch das Spiel kommt!

Weiters ist natürlich wieder wichtig, dass die ganzen Effekte bei der Beurteilung auch gesehen werden können. Baut ein, was auch immer dafür notwendig ist (Demo-Flythrough, um Effekte zu zeigen, die etwas versteckt sind, level-"cheats", um alle levels anschauen zu können, kurze Erklärung, wo man hingehen muss, um was bestimmtes zu sehen usw....).

Wie immer gilt, was wir nicht sehen, können wir nicht bewerten!

Weiters benötigt ihr für die Endabgabe einen Screenshot aus eurem Spiel im .png-Format in der Auflösung 640x480 und ein Video von mindestens 640x480 Auflösung in xvid-Komprimierung für die Hall of Fame.

Die Deadline für diese Abgabe findet ihr auf der Hauptseite.