Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 22:39

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schattenwelt
BeitragVerfasst: Di Dez 15, 2009 00:21 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Links

Projekt-Seite
Download der aktuellen Version

Einleitung

Hallo,

nachdem ich mich nun schon eine Weile in dem Forum hier rumtreibe, will ich auch mal eins von meinem Projekten vorstellen, an dem ich seit ca. einem Jahr (mit Unterbrechungen) gearbeitet habe und immer noch arbeite.
Bei dem Spiel, das ich damals aus Ermangeln eines besseren Namens "Schattenwelt" getauft habe, handelt es sich um so eine Art Multiplayer-Schleich-Shooter. Die ursprüngliche Idee unter dem Stichwort "Monster aus der Zwischenwelt" hat sich über "Monster hinter dem Spiegel" schließlich zum aktuellen Konzept entwickelt.
Ich weiß nicht ob jemand schon mal sowas ähnliches irgendwo gehört hat, ich bilde mir aber ein, dass das irgendwo aus einem Film ist. Allerdings ist das bestimmt schon 10 Jahre her und es kann gut sein das da ein paar Details in meiner Erinnerung verschwunden und andere hinzugekommen sind. Jedenfalls war das Grundmotiv bei der Zwischenwelt das die Monster aus einer anderen Dimension z.B. über den Türrahmen in unsere Welt eindringen können, weil der Türrahmen der Zwischenraum zwischen zwei Zimmern ist und sich damit mit der Welt der Monster, der "Zwischenwelt", überlagert. Die Idee war zwar schon ganz schön, ließ sich aber nicht so gut als ein Spiel umsetzen. Die Weiterentwicklung mit den Spiegeln würde da schon besser funktionieren, war meiner Meinung nach aber technisch zu aufwendig, jedenfalls damals.

Spielkonzept

Das jetztige Konzept hat nicht mehr viel mit den ursprünglichen Ansätzen zu tun.
Wie der Name schon sagt geht es um Schatten. Allerdings nicht irgendwelche, sondern lebendige. Eine Seite der Spieler übernimmt die Kontrolle über diese Schatten. Die andere spielt die Menschen, welche dagegen wirklich nur stinknormale Menschen sind.
Ein Spiel kann grob in zwei Phasen unterteilt werden, wobei die Grenzen nicht immer deutlich sind:
Am Anfang sind die "Schatten" noch relativ traditionell wie gewöhnliche Schatten, die wohl jeder aus dem richtigen Leben kennt. D.h. sie sind zweidimensional und auf Objekten drauf. Der Unterschied ist, das sie kein schattenwerfendes Objekt brauchen und sich bewegen können. Und da kommt auch eine Besonderheit zum Tragen. Die Schatten bewegen sich auf den Wänden und können so auch steile Wände hochkriechen und sich sogar an der Decke ihren Weg bahnen. Das Ziel eines jeden Spielers, der einen Schatten steuert ist es genügend von den kleinen schwarzen Wölkchen zu fressen, die ein bischen wie die Hoodlums aus Rayman aussehen. Diese dienen den Schatten als Nahrung, wodurch sie auch größer und kräftiger werden. Dieser Abschnitt erinnert sicherlich an das Spiel "Snake", das seit einiger Zeit auf vielen Handys zu finden ist. Die Schwierigkeit bei meiner Umsetzung ist aber nicht sich nicht selbst in den Schwanz zu beißen, sondern dem Licht auszuweichen, denn das Licht schadet den Kreaturen der Finsternis und macht sie außerdem für die Menschen sichtbar. Zusätzlich zu den Lichtquellen im Level hat jeder Spieler der Menschenfraktion eine Taschenlampe, wodurch sie auch etwas zu tun bekommen, nämlich die Schatten zu finden und daran zu hindern zur zweiten Phase überzugehen.
In dieser lösen sich die Schatten von den Wänden, überwinden ihre Zweidimensionalität und nehmen eine plastische Gestalt in Form einer Wolke aus purer Dunkelheit an. Vorteil dabei ist das die Schatten endlich auch zurückschlagen können. Außerdem sind sie nun immun gegen alle Lichtquellen. Der Nachteil ist, das sie wiederum durch Schusswaffen verletzt werden können. Natürlich sind "Wolken" nicht gerade gut mit Schusswaffen zu bekämpfen, aber um ihre Form aufrecht zu erhalten brauch es einiges an Anstrengungen und wird auch nicht einfacher wenn jemand auf einen schießt. Sollte sich dieser Zustand dennoch als momentan unvorteilhaft erweisen, können sich die Schatten auch wieder zurückverwandeln, nehmen aber die Schäden die sie erlitten haben mit, sodass sie unter Umständen erst wieder fressen müssen bevor sie erneut die Form wechseln können.

Spielmodi

Durch den Umstand, dass die Schatten im Vorteil sind, wenn es ums Verstecken geht, sich aber wiederrum nicht lange gegen die Menschen im Kampf halten können, fallen die meisten symmetrischen Spielmodi aus. Bisher habe ich deshalb nur eine begrenzte Auswahl:

Capture The Flag: Nicht ganz so wie das normale CTF, sondern einseitig. Die Schatten müssen die Flagge erobern und zu ihrer Basis bringen. Die Menschen müssen die Flagge einfach nur verteidigen. Also in etwa das selbe wie man das vielleicht aus dem Multiplayer von Splinter Cell: Double Agent kennt.
Survival: Die Menschen haben eine bestimmte Anzahl an Leben und müssen sich über das Zeitlimit retten. Die Schatten müssen sie logischerweise töten.
Munch: Dabei geht es darum als Schatten eine gewisse Länge zu erreichen. Die Menschen müssen das verhindern indem sie die Schatten mit ihren Taschenlampen anleuchten. Also relativ unbrutal. Da die Schatten mit zunehmender Länge auch besser zu finden sind, kann es schon relativ schwer sein eine gewisse Länge zu überschreiten.

Technik

Vor einiger Zeit bin ich wie littleDave bei seinem "Gael" auf Deferred Shading umgestiegen um auch eine größere Anzahl Lichter in den Levels haben zu können.
Ich verwende eine Textur mit 24Bit Depth- und 8Bit Stencilbuffer und jeweils eine Textur für Diffuse und Specular Farbe mit 8Bit pro Farbkanal. Die für die Diffuse Farbe enthält zusatzlich einen Alphakanal. Auch wenn Deferred Shading bekanntlich kein Alphablending unterstützt, benutze ich den Alphakanal für den Alphatest (GL_ALPHA_TEST). Theoretisch könnte man das Verhalten auch mit Shadern reproduzieren, auf der anderen Seite belegt der Alphakanal aber keinen zusätzlichen Speicher, da automatisch von 24Bit auf 32Bit aufgerundet wird. Also verschenke ich eher 8Bit bei der Specular-Textur weil ich den Kanal nicht brauche. Für die Normale benutze ich eine Textur mit 4 Half-Floats (GL_RGBA16F_ARB). Im Aphakanal ist außerdem die "Shininess" des Materials gespeichert. Warum die nicht bei der Specular-Farbe ist erkläre ich gleich.
Weiterhin habe ich 2 Texturen mit 16 bzw. 8Bit, wenn HDR ein- bzw. ausgeschaltet ist, pro Farbkanal, die die Summe der Lichtintensität aller Lichtquellen für den Diffuse- und Specular-Anteil speichern. Normalerweise könnte man auch schon ohne diese Texturen ein Bild erzeugen, allerdings habe ich bei meiner Umsetzung die Material/Textur-Farbe quasi nach dem Distributivgesetz ausgeklammert. Dadurch spare ich bei der Summierung der Lichtquellen 2 Texturlookups im Shader, sodass ich nur mit Tiefe und Normale auskomme. Außerdem erklärt sich hier warum der Shininess-Wert bei der Normale gespeichert ist. Andersfalls bräuchte ich nämlich einen zusätzlichen Texturlookup nur für diesen einen Wert. In einem zusätzlichen Pass werden dann die Texturen mit den dazugehörigen Farben multiplizert, was etwas Füllrate zusätzlich kostet. Man könnte vielleicht die Multiplikation zusammen mit dem letzten Licht in einem Pass erledigen, was ich aber noch nicht probiert habe, weil mir das erst jetzt grade beim Schreiben dieser Zeilen eingefallen ist.
Das Ergebnis der Beleuchtung landet dann in einer weiteren Textur, wobei ich die Textur für die Normale wiederverwende, sodass kein weiterer Speicher benötigt wird. Je nachdem ob HDR an oder aus ist folgen dann noch 3 Passes um den HDR-Anteil zu bluren und mit der LDR-Farbe zu kombinieren. Auch dafür werden 2 Texturen benötigt, die aber wieder durch die bereits verwendeten Texturen, die das Diffuse/Specular-Licht enthalten, ersetzt werden.
Ich habe das so gelöst das der HDR Anteil wie unten berechnet wird, sodass der Farbton erhalten bleibt.
Code:
  1. vec4 tempcolor=texelFetch2D( texture, ivec2(coordi[0]+i,coordi[1]), 1);
  2. float maxval=max(tempcolor[0],max(tempcolor[1],tempcolor[2]));
  3. if (maxval<=1.0)
  4. {
  5.     tempcolor=vec4(0.0,0.0,0.0,0.0);
  6. }
  7. else
  8. {
  9.     tempcolor=tempcolor/maxval*(maxval-1.0);
  10. }

Der LDR-Anteil ergibt sich aus "OriginalFarbe/Max(OrignialFarbe[0],OrignialFarbe[1],OrignialFarbe[2])". Das gilt natürlich nur wenn das Maximum der Farbkanäle größer als 1 ist. Jedenfalls bleibt auf diese Weise der Farbton weitgehend erhalten, auch wenn so wenige Pixel der Fläche zu sehen sind, dass es kaum einen Einfluss auf die HDR-Textur hat.

Für die Schatten verwende ich Shadow Volumes mit dem Stencilbuffer in der zFail Variante. Ich habe mich für Stencilschatten entschieden weil ich deutlich sichtbare Grenzen haben wollte, damit die Schattenspieler zweifelsfrei wissen ob sie hinter Objekten verborgen sind oder nicht. Außerdem ist die Level-Geometrie zwangsweise relativ simpel und ich habe garantiert keine Artefakte an den Grenzen oder Flächen durch ungeeigneten Bias.
Leider gibt es ein Problem auf ATI Grafikarten, wenn man in einem FBO eine Textur mit "DEPTH24_STENCIL8" für Tiefen- und Stencilpuffer benutzt, was sich in einigen unschönen Artefakten äußert. Und scheinbar ist das nichtmal mein Fehler sondern liegt am Treiber.

Für die Leveloberflächen verwende ich Normal- und Parallax-Mapping, allerdings recht sparsam, weil mir die Normalmaps dazu fehlen.

Worauf ich einigermaßen stolz bin ist die Darstellung der Schatten in ihrer "Wolkenform". Bevor ich die Idee dazu hatte waren das ganz normale Models, wobei ich schon Schwierigkeiten hatte diese ordentlich zu texturieren. Diese Models habe ich dann als Grundlage genommen um sie wie schwarze Wolken aussehen zu lassen. Eine Darstellung mit (sehr) vielen Partikeln würde zwar einfach zu realisieren sein, aber auch einges an Füllrate fressen. Anders als bei normalen Rauchwolken dürften die Partikel außerdem nicht zu groß werden, damit die Details nicht verloren gehen, wodurch ich noch viel mehr bräuchte. Also habe ich versucht den Modellen mit Shadern das gewünschte Aussehen zu geben. Die ersten versuche waren nicht sehr erfolgreich, außerdem wird durch den sanften Übergang, den die Wolken an den Außenlinien der Figuren haben sollen, das Volumen augenscheinlich verringert. Die Antwort darauf ist das Model dicker zu machen. Jeden einzelnen Vertex zu verschieben hielt ich für zu komplizert, sodass ich schließlich zu meiner jetzigen Lösung gelangt bin: In 3 Render Passes werden aus dem ursprünglichen Model, das in ein FBO gezeichnet wird, zwei Texturen erstellt, die die Transparenz und Tiefe der Wolke enthalten. Die Transparenz ist mit einem Gaussian-Blur-Shader geglättet, ebenso die Tiefe mit einer leicht abgewandelten Form um so auch Pixel außerhalb der normalen Fläche, die das Model bedeckt, zu erhalten. Zum Schluss wird das ganze mit 2 gegeneinander verschobenen Perlin-Noise-Texturen in die Szene eingefügt.

Für den Sound verwende ich die bass.dll, wobei es noch nicht viel zu hören gibt.
Für die Netzwerkkommunikation die Indy Komponenten, die ich nochmal in einer Klasse gekapselt habe um TCP und UDP zu vereinen.
Ansonsten benutze ich die glBitmap zum Laden der Texturen und natürlich den DGL-Header. ;)

Leveldesign

Gerade beim Erstellen der Level muss man ein paar Sachen beachten.
Zum einen muss die Oberfläche auf der sich die Schatten bewegen sollen als zusammenhängendes Netz aus Dreiecken vorliegen. D.h. jedes Dreieck darf an jeder Kante maximal einen Nachbarn haben. Als Basis für das Netz dient ein Model das genauso wie die Teile des sichtbaren Levels mit meinem Blenderexporter in mein Modelformat konvertiert wird, allerdings ohne Texturkoordinaten, weil es sonst automatisch aufgespalten würde. Möglicherweise ist es ein bischen schwierig das Level so zu entwerfen, da quasi alles aus einem Guss bestehen muss, andernfalls hätte der Computer aber einiges zu grübeln wie er die Oberfläche nun zusammensetzen soll. Und außerdem würde die Kontrolle über gewollt unpassierbare Stellen verloren gehen.
Der Umstand das sich Spieler auf der Oberfläche der Umgebung bewegen sollen, begrenzt außerdem den Detailgrad. Zwar sind feine Strukturen möglich, aber die Wellen eines Wellblechdachs zu modellieren ist vermutlich keine gute Idee, da die Steuerung erheblich erschwert würde. In etwa so als wenn man ein Ei geradeaus rollen will. Den Stencilschatten würde ein bescheideneres Leveldesign auch zugute kommen.
Weiterhin muss man darauf achten, dass möglichst alle Stellen von den Menschen ausleuchtbar sind, damit sich die Schatten nicht dort die ganze Zeit verstecken können.

Kompatibilität

Das ist etwas worum ich mich noch fast garnicht gekümmert habe. Wirklich bestätigt und 100%ig funktioniert mein Programm nur auf 2 Rechnern. Auf dem 3ten, mit der ATI Grafikkarte, hab' ich oben beschriebenen Grafikfehler. Man sieht zwar was, aber wirklich schön ist das nicht.
Unter anderem bedeutet das, dass das Ganze bisher nur unter Windows XP getestet wurde. Ob es unter Vista oder Windows 7 läuft weiß ich also nicht. Und dass man es unter Linux irgendwie lauffähig bekommt bezweifel ich ernsthaft.
Möglicherweise kümmer ich mich irgendwann mal darum, dass es mit Wine unter Linux funktioniert, aber da ich mich mit Linux überhaupt nicht auskenne, wird das noch etwas dauern.
Außerdem brauch' man eine relativ neue Grafikkarte. Zum einen wird die EXT_gpu_shader4 vorausgesetzt, auch wenn man das mit einiger Arbeit ändern könnte. Zum anderen brauch man mindestens 256MB Grafikspeicher, da Deferred Shading bekanntlich viel Speicher für die ganzen Texturen verbraucht. Allerdings gibt es da auch noch einiges an Optimierungpotential. So unterstützt mein Monitor zum Beispiel nur eine Auflösung von bis zu 1280x1024, reserviert ist aber momentan noch standardmäßig der Speicher durch 2048x2048 Texturen. Da könnte man also noch die Hälfte gutmachen.
Vor dem Zwang einer modernen Grafikarte rettet das allerdings nicht, da besonders auch die Schattenvolumen viel Füllrate benötigen.

Hier mal eine Liste was für Extensions gebraucht werden:
EXT_gpu_shader4
EXT_texture_filter_anisotropic (optional)
EXT_framebuffer_object
EXT_packed_depth_stencil
EXT_stencil_two_side (optional)

Ansonsten wird gerade für die Shader OpenGL 2.0 benötigt.

Entwicklungsstand

Alles in allem befindet sich das Projekt durchaus schon in einem spielbaren Zustand.
Mal eine Zusammenfassung:

    Grafik: ist vorhanden ^^
      Licht:funktioniert
      Schatten: funktionert
      HDR: funktioniert auch
      Menü und GUI: überarbeitet und einsatzbereit
      Modelle und Animationen: funktionieren theoretisch, praktisch fehlt mir aber noch ein richtiges Model für die Menschen sowie Animationen dafür
    Level: gibt es momentan 2, die recht einfach sind und nicht durchgängig ordentlich texturiert sind
    Steuerung: funktionert
    Kollisionserkennung und -behandlung: funktioniert, ist aber ein bischen holprig, dafür fällt man nur noch selten durch den Boden
    Netzwerk: die wichtigen Sachen funktioneren
      Spiellobby funktioniert
      Positions- und Richtungsübertragung vom Client zum Server sowie umgekehrt funktionieren
      Senden von Schüssen an den Server funktioniert (zurück an die Clients wird noch nichts geschickt)
      Übermitteln der HP, Punkte und die Position der Flagge für CTF funktioniert
      Animationen werden (die eine die ich hab') übertragen

Screenshots

Zu guter letzt noch ein paar Bilder, die die Hauptaspekte des Spiels zeigen:

Bild 1 zeigt einen Schatten der sich an der Wand entlangschlängelt und einen Menschen mit dem einfachen Platzhalter-Model
In Bild 2 ist nochmal ein Schatten. Der Balken links gibt den Beleuchtungsgrad durch das Licht an.
Bild 3 ist auch aus der Sicht eines Schattens, allerdings in der monsterhaften Wolkenform.
Bild 4 zeigt einen solchen Schatten aus Sicht eines Menschen.
In Bild 5 ist schließlich ein Schatten auf der Wand abgebildet wie er von einer Taschenlampe angeleuchtet wird. Was vielleicht etwas täuscht: der Schatten hat die selbe Farbe wie die Wände außerhalb des Lichts.

BildBildBildBildBild

Videos

Hier mal ein kurzes Video, welches das Parallax Mapping in Schattenwelt zeigt.


Zuletzt geändert von Schläfer am Fr Jan 01, 2010 03:38, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Do Dez 17, 2009 00:40 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ein kleines Update:

Ich hab' oben mal ein kurzes Video zum Parallax Mapping verlinkt.
Außerdem, was viel wichtiger ist, eine gute Nachricht für Linux-Benutzer: Ich hab' heute auf meinem Computer Ubuntu 9.10 zum Laufen bekommen und Schattenwelt getestet. Und es läuft (fast) einwandfrei mit Wine. Einzig der Ton von der bass.dll war nicht sonderlich gut, aber damit musste man wohl rechnen.
Wenn ich mich von den lizenztechnisch problematischen Inhalten getrennt habe, gibt es dann vielleicht auch das erste Release.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Fr Dez 18, 2009 21:30 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
So... ich hab' mal ein erstes Release vorbereitet und die Dateien bei Rapidshare hochgeladen. Einen ordentlichen Webspace hab' ich nicht, aber das Archiv ist auch nicht allzu groß.

7z - 2422 KB
rar - 2554 KB
zip - 2925 KB

Ich hoffe mal das jeder mindestens eins davon entpacken kann. "tar" hab ich jetzt nämlich nicht.

Mal noch ein paar Worte zur Bedienung:

Startmenü:

Bild

Ich hoffe mal, dass das Menü weitgehend selbsterklärend ist. Man wählt ein Level oben (gibt nur 2), falls man sich nicht irgendwo verbinden will lässt man das auf "Server" eingestellt. Dann drückt man auf "Start Server/Client". Dann kann man das Team wählen und drückt dann auf "Start Game". Dann lädt es nochmal und dann gehts auch gleich los.
Wenn sich ein Client verbinden will (kann ja auch sein man will das Programm auf dem gleichen Rechner 2 mal starten) dann geht das erst nachdem der Server auf "Start Server/Client" gedrückt hat. Ist ja auch irgendwie logsch. Dann müsste auch hinter "Schatten" ein weiterer Zähler hinzukommen. Der Client lädt automatisch nachdem der Server mit Laden fertig ist nachdem man auf "Start Game" gedrückt hat.

Rechts auf der Seite beim Startbildschirm sind ein paar Einstellungen, die vor dem Spiel festgelegt werden müssen. Im Spiel geht das dann im Allgemeinen nicht mehr umzustellen. "Auflösung" und "Vollbild" sollte selbsterklärend sein. Da die meisten hier ja mehr von solchen Dingen verstehen als der durchschnittliche Gamer, erläuter ich mal was genau die Einstellungen machen:
Bei HDR gibt es 3 Einstellungsmöglichkeiten: "Aus", "Normal", "Hoch". Bei "Aus" werden 8Bit pro Farbkanal verwendet, bei "Normal" und "Hoch" 16Bit. Richtiges HDR hat man aber nur bei "Hoch". Bei "Normal" wird lediglich in eine Floating-Point-Textur gerendert, ohne den HDR Anteil zu bluren. Da das einiges an Leistung einspart, aber trotzdem besser aussieht als mit normalen Texturen hab ich das noch drin.
Bei Shader gibt es auch 3 Varianten zur Auswahl: Auf "Niedrig" sind alle Flächen ganz primitiv und flach. Bei " Normal" kommt Bump Mapping hinzu und auf "Hoch" noch Parallax Mapping.
Die Einstellung bei "Monster" entscheidet darüber ob eine 256x256 oder 512x512 Textur für die wolkigen Schatten verwendet wird. Ich lass das eigentlich meistens auf "Normal".

Achso, der Button "Anwenden" bezieht sich nur auf die Auflösung und Vollbild, das ist vielleicht ein bischen irreführend, weil der ganz unten ist.

Steuerung im Spiel:

Im Spiel steuert man mit WASD, Springen geht mit Leertaste, Schießen und Schlagen mit Maus Links. Die Menschen können außerdem kurze Zeit (1sec) sprinten, wenn man auf Shift drückt. Das geht aber nur nach vorne und ist zum Wegrennen vor den Schatten gedacht. Danach muss man bis zu 5sec warten bis man wieder die volle Zeit sprinten kann.
Die Schatten lassen sich auch mit WASD in beiden Formen steuern und mit Rechtklick verwandeln die sich hin und her.
Allerdings kann man sich nur verwandeln, wenn die Länge (unten links) einen gewissen Wert überschritten hat. Die Zahl wird dann grün. Wenn man sich zurückverwandelt verliert man außerdem immer 1 Längeneinheit, damit "Hit-And-Run" verhindert wird. Die Schatten können sich außerdem nicht verwandeln wenn sie zu stark angeleuchtet werden (Balken links ist ganz grün ausgefüllt und füllt sich weiter mit Gelb). Wenn der Balken rot ist, verliert man pro Sekunde eine Längeneinheit.
Um die Maus frei zu bekommen oder das Menu einzublenden muss man ESC drücken.
Die Einstellungmöglichkeiten die man InGame machen kann sind nicht so ausschlaggebend. HDR kann man austellen falls sich herausstellt das es zu langsam läuft. Anstellen geht aber nicht wenn man es vorher nicht auf "Hoch" hatte, weil ich InGame nichts an den Texturen änder. Würde theoretisch zwar möglich sein, hab' ich aber noch nicht umgesetzt.
Das "Schatten-Detail" bezieht sich nicht auf die Wolkenform sondern auf die Schlangen-Schatten an den Wänden. Da die aus Kegeln aufgebaut sind, kann man dort die Anzahl selbiger ändern.

Dann noch eine Liste mit Bugs und einkalkulierten Fehlern oder anderen Limitierungen, bevor hier alle aufschreien "xyz funktioniert nicht":

    -Linux-Benutzer müssen wahrscheinlich recht lange warten, bis überhaupt das Fenster zu sehen ist.
    -Die Lauffähigkeit und das Vorhandensein von den einzelnen Extensions wird nicht im Vorfeld überprüft. Falls etwas fehlt kommt wahrscheinlich nur ein Fehler.
    -Die Dateien zu den Leveln, Shadern usw. sind einfache Text-Dateien, d.h. man kann auch gegebenenfalls etwas ändern. Bei den Leveln sollte man aber nicht drin rumpfuschen wenn man wirklich mit jemand anderem spielen will, weil nicht überprüft wird ob alle die selben Dateien haben.
    -Wenn man auf [Q] im Spiel drückt, werden die FPS, Netzwerk-Traffic und ein paar Sachen angezeigt die ich zum Debuggen gebraucht hatte. Außerdem sieht man das Skelett der Spielfiguren auch durch Wände, was man benutzen könnte um zu Cheaten. Das wird später natürlich entfernt.
    -Team wechseln während des Spiels geht nicht.
    -Neue Spieler können während eines laufenden Spiels nicht joinen.
    -Wenn der Client das Team wechselt nachdem der Server angefangen hat zu laden, führt das zu einer Exception bei beiden
    -Die Felder wo man Port und Host einstellen kann, reagieren auch wenn das Fenster nicht fokusiert ist.
    -CapsLock geht bei den Editorfeldern nicht.
    -InGame Chat, geschweige denn Voice-Chat gibt es nicht
    -Die Spielmodi lassen sich noch nicht einstellen sondern sind fest in den Level-Dateien vorgeschrieben. "1vs1" ist "Munch" mit Länge 70 und "2vs2 ctf" ist Capture The Flag :roll: mit 3 als Punkte Limit.
    -Wenn man sich Mühe gibt kann man bei manchen Kanten durch den Boden fallen.
    -Die Waffe der Menschen muss nicht nachladen und hat unendlich Munition.
    -Die Schatten können fast unbegrenzt schnell hintereinander zuschlagen, indem man einfach ganz schnell immer Linksklickt, die Animation ist also nicht synchron.
    -Die Animation, wenn die Schatten aus dem Boden zu ihrer plastischen Gestalt wechseln, sieht man bei den anderen Spielern nicht.
    -Die Schlaganimation von den Schatten sieht man nur beim Spieler der den Schatten steuert und beim Server.
    -Auf ATI-Grafikarten (zumindest auf der einen hier bei mir) hat man einige Artefakte, die durch irgendein Problem mit dem Stencilbuffer verursacht werden.
    -Bei Monitoren die auch sehr niedrige Auflösungen unterstützen zB 320x240 ist das Fenster am Anfang so klein das man nichtmal den ganzen Text der Einstellungen sieht. In dem Fall muss man das Fenster einfach größer ziehen. Das Programm im Vollbildmodus auf so einer Auflösung zu betreiben ist vermutlich keine gute Idee, da die Texte eine feste Größe in Pixeln haben.
    -Die Steuerung der Schatten auf den Wänden ist vielleicht ein bischen gewöhnungsbedürftigt. Man steuert immer wenn man z.B. [W] (nach oben) drückt auf dem Monitor nach oben. Bei einer Drehung der Kamera kann sich so die Bewegungsrichtung umkehren.
    -Man kann durch das untere Fenster auf der zweiten Karte durchspringen, obwohl man eigentlich zu groß ist.
    -Für die Kollisionserkennung bei der Bewegung werden nur 2 Kugeln verwendet. Dazwischen ist nichts, was sich bei den kleinen Brücken bemerkbar machen kann.
    -es gibt keine Skybox

...hm, glaube mal das war jetzt alles. Zumindest fällt mir grade nichts mehr ein. Ich hoffe aber mal ihr lasst euch von der langen Liste nicht abschrecken. Ich wollte bloß im Vorfeld über die Fehler aufklären, damit keine falschen Hoffnungen entstehen.

Wenn das Spiel nicht läuft:

    -Überprüfen ob die Grafikarte alle nötigen Extensions kann:
      EXT_gpu_shader4
      EXT_framebuffer_object
      EXT_packed_depth_stencil
    -Überprüfen ob man mindestens 256MB Grafikspeicher hat.
    -Windows benutzen :wink: , ne aber falls es unter Linux (mit Wine) nicht funktioniert mal bitte posten. Das betrifft natürlich auch alle anderen Fehler.
    -Falls er rummeckert das irgendwelche Funktionen in den Shadern nicht verfügbar sind, kann man das auch selber ändern, wenn man weiß wie. In beiden Fällen aber bitte auch posten.

Wenn es zu langsam läuft:

    -HDR runterstellen
    -"Monster"-Detail auf Normal stellen (wirkt sich natürlich nur aus wenn auch ein Monster zu sehen ist).
    -Auflösung verringern


Zum Schluss möchte ich noch anmerken, dass ich es noch nicht im Internet getestet habe, sollte aber theoretisch funktionieren, außer vielleicht das es laggt. Stand-Alone-Server gibt es noch nicht. Besonders viel habe ich seit meinen Anfangspost noch nicht geändert. Nur ein bischen Performance verbessert, Bugs behoben und Menü verbessert.
Die Performance ist wahrscheinlich allgemein nicht besonders gut. Bei mir auf meinem Intel Core2Duo E8400 mit NVidia Geforce 8800 GTS 512 läuft es bei einer Auflösung von 1280x1024 mit HDR und Shadern auf "Hoch" mit ca. 75 FPS, wenn man als Mensch alleine im zweiten Level ist. Damit ihr vielleicht einschätzen könnt, wie es bei laufen sollte.

Und falls jemand das dringende Bedürfnis hat neue Maps zu entwerfen, kann er dies gerne tun. Solange man das in Blender importieren kann, kann ich darauß auch die Dateien für meine Level machen. Ich tu mich da immer etwas schwer Content zu entwickeln. Außerdem fehlen mir Texturen mit vernünftigen Normalmaps, sowie ein Model für die Menschen.


Zuletzt geändert von Schläfer am Sa Dez 19, 2009 20:10, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Sa Dez 19, 2009 20:09 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Schon wieder ein Update (ist ja Wochenende).

Hier die Änderungen:

19-12-09

    -Abhängigkeit von EXT_gpu_shader4 entfernt. Es gibt jetzt 2 Versionen für die betroffenen Shader, wobei automatisch Shader Model 4 verwendet wird, wenn unterstützt.
    -neue Detailstufe für HDR: Das vorherige "Normal" heißt jetzt "Niedrig". Das neue "Normal" verwendet jetzt als Basis 1/16 (1/4 x 1/4) der Fenstergröße und ist richtiges HDR.
    -HDR bei Nachtsicht (also wenn man einen Schatten steuert) verbessert.
    -Erzeugung der Textur für die Textausgabe beschleunigt. Besonders Linux-Benutzer sollten das merken.
    -Editorfelder reagieren nicht mehr auf Tastenanschläge wenn das Fenster nicht fokusiert ist.
    -Bug in der Lobby bei der Teamauswahl, der zu den Exceptions führen konnte, behoben.
    -einfache Skybox hinzugefügt
    -kleiner Rechtschreibfehler korrigiert, der zwar nicht wirklich das Spiel beeinflusst aber den Changelog länger aussehen lässt. :wink:
    -Bilder im Ladebildschirm (gibt momentan nur eins) werden jetzt an die Fenstergröße angepasst.
    -Schatten können nicht mehr unendlich schnell hintereinander zuschlagen.
    -Darstellung der Wolkengestalt-Schatten verschönert.
    -Berechnung für den Lichtkegel im Shader durch Lookup-Texture ersetzt. Bringt einen kleinen Geschwindigkeitsvorteil und ist außerdem flexibler.

20-12-09

    -Umlaute in den Dateinamen ersetzt.

21-12-09

    -Schlag-Animation der Schatten wird jetzt auch zurück an alle Clients gesendet.
    -separates Model für Schatten der Levelgeometrie. Dadurch kann man auch Objekte in die Level einfügen die keinen Schatten werfen. Außerdem sollte das die Performance verbessern.

22-12-09

    -Menü überarbeit (sollte jetzt übersichtlicher sein)
    -Spielmodus lässt sich jetzt vor dem Spiel einstellen (CTF kann man nur wählen, wenn in der Level-Datei auch die Position der Flagge und des Ziels festgelegt sind).
    -Punktelimit lässt sich nun einstellen.
    -Rundenlänge ist jetzt einstellbar.

23-12-09

    -neue Detailstufe "Niedrig" für die Wolkenschatten, auf der die Wolken keinen weichen Rand mehr haben.
    -neues Bild für den Ladebildschirm.
    -Menschen und Schatten haben jetzt 3 Kugeln als Bounding-Volume bei der Kollisionserkennung für die Bewegung.

Eine neue Version hab' ich noch nicht hochgeladen. Falls das dann der Fall ist, ergänze ich das hier.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Sa Dez 26, 2009 20:28 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
So... es gibt ein neues Release: 23-12-09
Zu finden ist das Ganze nun auf meiner neuen Seite hier bei DGL: http://schlaefer.delphigl.com/

Die Versionsnummern bei mir sind Daten, wie ihr sicher merkt, weil ich es versäumt habe von Anfang an ordentlich zu Nummerieren. Aber ich denke mal das spielt keine große Rolle.


Zuletzt geändert von Schläfer am Fr Jan 01, 2010 18:09, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Mi Dez 30, 2009 02:17 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Update:

2 Dinge hab' ich neu eingebaut, die beide darauf abzielen das Programm auch mit älteren Grafikkarten benutzen zu können:

Erstens kann man jetzt den Specular-Teil der Beleuchtung ausschalten. Das bringt mehr als 10% Leistung. Außerdem reduziert es die Anzahl der Texturen die in den Shadern benötigt werden. Auf manchen älteren Grafikkarten führte die Anzahl von 5 Texturen in einem Shader zu erheblichen Geschwindigkeitseinbußen.

Zweitens kann man jetzt statt einer Textur mit 4 Half-Floats eine mit 8Bit pro Farbkanal benutzen. Dabei geht es nicht so sehr um den gewonnenen Speicherplatz sondern um Kompatibilität. Offenbar konnte man früher in FBOs nur in mehrere Texturen gleichzeitig rendern wenn diese dieselbe Größe (nicht die Abmessungen, sondern der Speicherbedarf) hatten. Bei den neueren Grafikkarten gibt es diese Beschränkung wahrscheinlich nicht mehr so oft. Allerdings sind 8Bit pro Achse recht wenig und verfälschen die Beleuchtung recht stark. Normalerweise verwendet man bei solchen Texturen 16Bit aus 2 Kanälen für 2 Achsen und errechnet die Dritte. Allerdings ist in einem Farbkanal bei mir auch der "Shininess"-Wert des Materials gespeichert. Bei Verwendung der 32Bit-Textur wollte ich aber nicht zwangsweise auch die Specular-Beleuchtung ausschalten. Deshalb verwende ich für x und y Wert der Normale jeweils 12Bit, was meistens ganz gut aussieht und bloß ein leichtes Flackern zur Folge hat, wenn man die Kamera dreht.

Edit: Ich hab' grad noch einen kleinen Fehler in einem Shader gefunden. Das Bild wird dadurch zwar nicht sichtbar verändert, aber falsch ist es dennoch. Ich lade aber gleich eine korrigierte Version hoch.


Zuletzt geändert von Schläfer am Di Jan 05, 2010 17:13, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Fr Jan 01, 2010 04:07 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Erstes Update im neuen Jahr:

Ich hab' das Packen und Entpacken der Normale in die 32Bit-Textur verbessert, sodass es jetzt schneller läuft und damit auch ein winzig kleines bischen performanter als die Variante mit der 64Bit-Textur ist. Außerdem hab' ich dabei gemerkt, dass das Flackern durch einen Fehler im Shader verursacht wurde, den ich dann auch behoben habe.

Download gibts auf meiner Seite: http://schlaefer.delphigl.com/download.php
Das direkt in den Thread hier verlinken, lass ich in Zukunft bleiben, weil die Links ungültig werden, wenn ich die alten Versionen wieder von Server schmeiße. Im Eingangspost hab' ich auch oben den Link zur Downloadseite hinzugefügt.

Falls ihr euch wundert: Die aktuelle Version ist 31-12-09, weil ich die Änderungen am Programm gestern vorgenommen habe.

P.S.: Frohes neues Jahr


Edit: Ich hab grade noch grade noch ein paar Updates vorgenommen:

    Erstens hab' ich was rausgelöscht was ich zum Debuggen drin hatte und vergessen hatte.
    Zweitens sollte das Programm jetzt auch funktionieren wenn man es durch ein anderes starten lässt. Unter anderem kann man es jetzt auch unter Linux aus der Konsole heraus mit Wine benutzen.
    Drittens hab' ich die Einstellungsmöglichkeiten für die Lichter in den Levels erweitert, sodass man auch die Farbe festlegen kann (war vorher im Programm festgelegt)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Di Jan 05, 2010 16:43 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Wieder mal ein Update:

Zum einen hab' ich 2 neue Spielmodi hinzugefügt: Survival und Sneak.
Survival sollte klar sein, hab' ich oben auch schon mal beschrieben. Und bei Sneak handelt es sich um den Spielmodus den ich auch schon mal im Meinungsthread erwogen hatte: Die Schatten müssen unerkannt so nah wie möglich an die Menschen herankommen. Damit das auch einigermaßen spielbar ist, hab' ich die Geschwindigkeit der Schatten wenn sie auf den Flächen entlang kriechen auf die Laufgeschwindigkeit der Menschen erhöht. Potenziel problematisch wird es aber mit statischen Lichtquellen in den Levels und bei mehreren Menschen die sich gegenseitig anleuchten und sich so quasi "vercampen" können. Da muss ich mir noch was einfallen lassen.
Außerdem gibt es bei Survival noch keinen Respawn-Zwang, was natürlich auch das Spielprinzip aushebelt.

Weiterhin hab' ich eine neue Grafikoption hinzugefügt, die die Grafikfehler auf der Radeon HD 4670 bei mir zu Hause behebt. Ob das wirklich ein generelles Problem der ATI-Treiber ist kann ich natürlich nicht sagen. Für einen empirischen Beweis ist eine Grafikkarte auch ein bischen wenig. Jedenfalls scheint es so als ob der Stencilteil aus der geteilten "DEPTH24_STENCIL8"-Textur auch die Werte aus dem Tiefenbuffer beeinflusst. Deshalb kopiere ich die Tiefe vorher in eine eigene Textur, was natürlich zu Lasten der Performance geht, und deshalb auch optional ausstellbar ist, falls man keine Grafikfehler haben sollte.

Und dann hab' ich noch ein paar kleinere Verbesserungen vorgenommen:
    Partikeleffekte an den Einschussstellen
    Kurze Beschreibungen, was die einzelnen Grafikeinstellungen genau bewirken
    und leichte Schatten hinter den Menü-Texten, da der blaue Text unter Umständen nicht so gut auf blauem Hintergrund zu lesen ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Fr Jan 22, 2010 17:23 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Im Moment arbeite ich an mehreren größeren Leveln. Durch die erhöhte Polygonanzahl musste ich auch einiges am Programm selbst verbessern:

    -Die Kollisionserkennung und -behandlung der Menschen und plastischen Schatten benutzt jetzt einen Octree.
    -Die Berechnungen die Prüfen ob ein Schatten (in 2D-Form) im Licht ist, können jetzt wahlweise von der Grafikkarte übernommen werden. Dabei wird ein Shader verwendet wobei ein Pixel ein Dreieck der Level-Geometrie darstellt. Kollidiert die Strecke von der Lichtquelle zum zu prüfenden Punkt nicht mit dem Dreieck wird der Pixel mit "discard" verworfen. Ein Occlusion Query prüft dann wieviele Dreiecke geschnitten werden. Wenn die Anzahl größer 0 ist liegt der Punkt folglich im Schatten.
    -Für die Schattenvolumen der Menschen und Level (bei dynamischen Lichtquellen) werden jetzt auch VBOs benutzt. Vorher wurden die per Immediate Modus gezeichnet. Ein VBO enthält die untransformierten Vertices und in einen anderen werden jeden Frame die Indizes der Dreiecke die zum Volumen gehören aktualisiert. Die Positionen der extrudierten Vertices werden vom Vertex-Shader berechnet.

Außerdem hab' ich noch ein paar sonstige Änderungen vorgenommen:

    -Die Modelle der Menschen-Spieler hatten versehentlich keinen neuen Shader bekommen als ich auf Deferred Shading umgestellt hatte, wodurch sie keine Normalen hatten, was natürlich zu falschen Lichtberechnungen geführt hat. Das habe ich jetzt geändert.
    -Die Menschen sind jetzt ein bischen kleiner, weil sie vorher größer als beabsichtigt waren.
    -Der Blickwinkel der Menschen und Schatten ist jetzt größer, was hoffentlich die Orientierung erleichtert. Außerdem ist der Winkel des Lichtkegels etwas größer.
    -Die Größe der Texturen die für das Deferred Shading verwendet werden, reduziert sich jetzt automatisch wenn die Auflösung es zulässt. Bei einer Auflösung von 1280x1024 zum Beispiel wird jetzt nurnoch halb soviel Speicher dafür verwendet.
    -Die Menüs sollten jetzt nicht mehr reagieren, wenn das Fenster nicht den Focus hat.

Ich lad' dann auch die neue Version hoch, allerdings noch ohne die (noch nicht fertigen) Level, weil ich außerdem noch ein paar andere Probleme lösen muss, damit es einigermaßen spielbar wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenwelt
BeitragVerfasst: Mi Mär 31, 2010 21:29 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Nachdem ich die letzten 2 Monate mehr Computerspiele gespielt und weniger programmiert hatte, hab' ich in den vergangenen Tagen wieder ein bischen an Schattenwelt gearbeitet.

Zum einen hab' ich endlich den Algorithmus, der die Schattenvolumen berechnet, verbessern können. Dadurch sollten wesentlich weniger Polygone benutzt werden. Das wird dadurch erreicht, dass bereits im Schatten liegende Dreiecke selber keinen Schatten mehr werfen (was ja auch sinnlos ist). Um zu überprüfen ob ein Dreieck vollständig im Schatten ist, wird jedes andere Dreieck aus Sicht der Lichtquelle in ein FBO gezeichnet und am Schluss per Occlusion-Query überprüft ob das zu testende Dreieck noch Pixel hinzufügt. Das ganze wird in alle 6 Richtungen gemacht und für jedes Dreieck und natürlich für jedes Licht einzeln.
Da das ziemlich aufwendig ist und mehrere Minuten dauern kann, werden die so erstellten Schattenvolumen auf die Festplatte gespeichert und geladen, damit sie nur neu berechnet werden müssen, wenn sich etwas an den Lichtern oder der Geometrie verändert hat.

Außerdem habe ich das Beleuchtungsmodell geändert. Normalerweise strahlt das Licht unendlich weit, auch wenn es immer schwächer wird und irgendwann nicht mehr wahrnehmbar ist. Das neue Licht in Schattenwelt hat nun eine maximale Reichweite, die man frei wählen kann. Das ist zwar physikalisch nicht korrekt, sieht aber auch nicht merklich anders aus und hat ein paar entscheidene Vorteile:
Da das Licht begrenzt ist, kann man nun für kleine Lichtquellen die Schatten ausstellen ohne das es durch Objekte hindurchleuchtet. Keine Schatten heißt, dass keine Schattenvolumen berechnet und gezeichnet werden müssen und somit Füllrate gespart wird.
Außerdem kann der Bereich der beleuchtet wird verkleinert werden. Da beim Deferred Shading hauptsächlich die Füllrate die Geschwindigkeit begrenzt, ist es überaus vorteilhaft, wenn der Beleuchtungsshader nur die Pixel verarbeitet die auch tatsächliche beleuchtet werden können. Für kleine oder weit entfernte Lichter kann man so mit Hilfe von glScissor den Bereich erheblich einschränken.

In dem neuen Release von heute hab' ich außerdem mal das neue Level mit drin, was allerdings immernoch nicht fertig ist. Das ganze wird so eine Art Bürogebäude, dem allerdings noch ein Keller und Möbel fehlen. Außerdem ist das meiste noch nicht texturiert, was es als Schatten äußerst schwierig macht sich zu orientieren. Dafür kann man aber die Lichtschalter testen. :D An- und Auschalten geht mit [E], wenn man mit der Bildschirmmitte über dem Lichtschalter ist.
Die Lichtschalter sollten auch ein Klickgeräusch machen, wenn man sie betätigt, was meiner Meinung nach erheblich zur Atmosphäre beiträgt. :wink:
Den Download gibts auf meiner Seite, die im Anfangspost verlinkt ist.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Sonstiges » Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 48 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.100s | 17 Queries | GZIP : On ]