[Projekt] Rayworld-NG
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
[Projekt] Rayworld-NG
Hallo zusammen,
nach Dekaden C/C++ und anderen habe ich mich, wie hier ja auch schon erwähnt, Anfang des Jahres einmal Zig gewidmet. Als Spielprojekt musste ein Evergreen herhalten: ein Oldschool-Raycaster mit ein paar modernen Erweiterungen. Dazu zählen Spiegelungen, Lichtbrechung und eine kleine Hintergrundsimulation, um die SIMD-Features zu testen.
Als initialen Projektstand poste ich hier einfach mal Screenshots der GitHub-Seite, um einerseits die Einstiegshürde zu nehmen und etwas zu zeigen und andererseits nicht alles neu zu schreiben.
Bei Interesse gerne reinschauen:
https://github.com/bfeldpw/rayworld-ng
nach Dekaden C/C++ und anderen habe ich mich, wie hier ja auch schon erwähnt, Anfang des Jahres einmal Zig gewidmet. Als Spielprojekt musste ein Evergreen herhalten: ein Oldschool-Raycaster mit ein paar modernen Erweiterungen. Dazu zählen Spiegelungen, Lichtbrechung und eine kleine Hintergrundsimulation, um die SIMD-Features zu testen.
Als initialen Projektstand poste ich hier einfach mal Screenshots der GitHub-Seite, um einerseits die Einstiegshürde zu nehmen und etwas zu zeigen und andererseits nicht alles neu zu schreiben.
Bei Interesse gerne reinschauen:
https://github.com/bfeldpw/rayworld-ng
Re: [Projekt] Rayworld-NG
Danke :-)
Was ich bislang immer wieder vergessen habe, ist eine einfache Art von Flat-Shading für den Anfang, bevor es richtig an die Beleuchtung geht, die den Raycaster-Code nutzen sollte.
Das Flat-Shading ist nicht ganz so "flat", da jeder Sichtstrahl einen anderen Winkel zur Normalen hat und damit auch Flächen einen leichten Verlauf aufweisen. Das führt in Ecken zu einem automatischen AO-Effekt und natürlich wird alles etwas stimmiger und Säulen plastischer. Für < 10 Zeilen zusätzlichen Codes eine echte Low-Hanging-Fruit, die endlich gepflückt werden wollte.
- Schrompf
- Moderator
- Beiträge: 4657
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [Projekt] Rayworld-NG
Schick, echte Retro-Stimmung
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: [Projekt] Rayworld-NG
Danke :-)
Es macht schon fast mehr Spaß, sich mittels Minimap statt in der 3D-Szene zu bewegen, die Strahlengänge sind einfach (gerade in Bewegung) immer wieder faszinierend. Wer genau hinschaut, findet in einem größeren Glasblock auch die eine Zelle, die ein Material mit anderem Brechungsindex aufweist :-) Ansonsten habe ich mal meine Funktionen zur Performance-Messung überholt und die rudimentäre GUI damit gefüttert. Je nach Einstellung sind die Werte gemittelt, hier über eine Sekunde, jetzt sehe ich wenigstens live, wo noch wieviel Luft nach oben ist:
Es macht schon fast mehr Spaß, sich mittels Minimap statt in der 3D-Szene zu bewegen, die Strahlengänge sind einfach (gerade in Bewegung) immer wieder faszinierend. Wer genau hinschaut, findet in einem größeren Glasblock auch die eine Zelle, die ein Material mit anderem Brechungsindex aufweist :-) Ansonsten habe ich mal meine Funktionen zur Performance-Messung überholt und die rudimentäre GUI damit gefüttert. Je nach Einstellung sind die Werte gemittelt, hier über eine Sekunde, jetzt sehe ich wenigstens live, wo noch wieviel Luft nach oben ist:
- Schrompf
- Moderator
- Beiträge: 4657
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [Projekt] Rayworld-NG
Ich glaube gern, dass damit rumzuspielen Spaß macht. Das Ding würde sich auch für diffuse Spiegelungen anbieten, wo Du nicht mehr nen Strahl, sondern eine Cone durch die Szene traced. Aber da schlägt wieder meine Obsession mit vorintegrierten Traces durch.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: [Projekt] Rayworld-NG
Hey Schrompf, ja, mit den Cones ist grundsätzlich eine gute Idee, wobei, kannst du mir nochmal ein Stichwort geben, was du genau mit "vorintegrierten Traces" meinst?
Tatsächlich bin ich gerade dabei, die Datenstrukturen so umzustellen, dass "gesplittet" werden kann. Hauptsächlich, um bei Glas Reflexion und Lichtbrechung gleichzeitig zu verfolgen. Da hatte ich auch schon die Überlegung, je nach Material z.B. 8 oder 16 Strahlen in einem materialabhängigen Öffnungs- und Reflexionswinkel zu "spawnen", das käme dem Cone ja schon recht nahe.
Die, ich sage mal einfachste Form von Diffusion, ist bereits enthalten. Jedes Segment hat einen Scatter-Parameter, der bestimmt, wie sehr der Ausfallswinkel bei der Reflexion gestreut wird. Es wird zwar in dem Sinne nicht diffus, allerdings sind die Kanten reflektierter Wände nicht mehr sauber/glatt, sondern eher "wellig", bzw. in der Höhe etwas verrauscht. Das gibt bereits einen gewissen Eindruck von Unschärfe und damit subjektiv Diffusion im Sinne rauer Wände, die nicht ideal reflektieren.
Der Parameter ist allerdings default stark reduziert, da es sonst passiert, dass ein Strahl direkt die Ecke einer vorstehenden Wand trifft, der nächste dann, wegen der Streuung, daran vorbeigeht und der dritte wieder trifft. Diese Lücken sehen nur gut aus, wenn man die Augen zusammenkneift ;-). Und eine Glättung über die Horizontale gibt es (noch) nicht.
Edit: Zu letzterem noch zwei Screenshots, Spielersicht und Blick hinter (über) die Kulissen -- zum Verdeutlichen mit sehr starker Streuung:
Tatsächlich bin ich gerade dabei, die Datenstrukturen so umzustellen, dass "gesplittet" werden kann. Hauptsächlich, um bei Glas Reflexion und Lichtbrechung gleichzeitig zu verfolgen. Da hatte ich auch schon die Überlegung, je nach Material z.B. 8 oder 16 Strahlen in einem materialabhängigen Öffnungs- und Reflexionswinkel zu "spawnen", das käme dem Cone ja schon recht nahe.
Die, ich sage mal einfachste Form von Diffusion, ist bereits enthalten. Jedes Segment hat einen Scatter-Parameter, der bestimmt, wie sehr der Ausfallswinkel bei der Reflexion gestreut wird. Es wird zwar in dem Sinne nicht diffus, allerdings sind die Kanten reflektierter Wände nicht mehr sauber/glatt, sondern eher "wellig", bzw. in der Höhe etwas verrauscht. Das gibt bereits einen gewissen Eindruck von Unschärfe und damit subjektiv Diffusion im Sinne rauer Wände, die nicht ideal reflektieren.
Der Parameter ist allerdings default stark reduziert, da es sonst passiert, dass ein Strahl direkt die Ecke einer vorstehenden Wand trifft, der nächste dann, wegen der Streuung, daran vorbeigeht und der dritte wieder trifft. Diese Lücken sehen nur gut aus, wenn man die Augen zusammenkneift ;-). Und eine Glättung über die Horizontale gibt es (noch) nicht.
Edit: Zu letzterem noch zwei Screenshots, Spielersicht und Blick hinter (über) die Kulissen -- zum Verdeutlichen mit sehr starker Streuung:
Re: [Projekt] Rayworld-NG
Schöne Sache :)
Ich glaube was Schrompf mit "vorintegriert" meinte, war grob gesagt: Die Rauminformation ist hierarchisch in Voxel verschiedener Größenstufen eingeteilt, wobei z.B. die nächstgröbere Stufe den Durchschnitt der acht (2x2x2) enthaltenen Subvoxel enthält ("vorintegriert", bzw. 3D-Mipmaps mehr oder weniger). Wenn man nun einen Cone durch den Raum schickt, muss er theoretisch nur auf die vorintegrierte Rauminfo zugreifen, die seiner Breite an jener Stelle entspricht. Und muss nicht auf viele einzelne Voxel oder Rays aufgeteilt werden. Was die Ausführungsgeschwindigkeit unabhängig vom Cone-Durchmesser relativ konstant halten würde. Wodurch auch keine Information verpasst würde (z.B. sehr helles kleines Objekt in weiter Ferne, welches durch Ray-Sampling übersehen werden könnte oder stark flackert bei Bewegung).
Aber ich mag mich im Detail täuschen, er hatte das mal beim Stammtisch vorgestellt, aber wahrscheinlich hatte ich nur 10% seiner Ausführungen wirklich verstanden ;) Denn so wie ich es hier zu erklären versuche fühle ich da mehr Probleme als Lösungen aufpoppen.
Ich glaube was Schrompf mit "vorintegriert" meinte, war grob gesagt: Die Rauminformation ist hierarchisch in Voxel verschiedener Größenstufen eingeteilt, wobei z.B. die nächstgröbere Stufe den Durchschnitt der acht (2x2x2) enthaltenen Subvoxel enthält ("vorintegriert", bzw. 3D-Mipmaps mehr oder weniger). Wenn man nun einen Cone durch den Raum schickt, muss er theoretisch nur auf die vorintegrierte Rauminfo zugreifen, die seiner Breite an jener Stelle entspricht. Und muss nicht auf viele einzelne Voxel oder Rays aufgeteilt werden. Was die Ausführungsgeschwindigkeit unabhängig vom Cone-Durchmesser relativ konstant halten würde. Wodurch auch keine Information verpasst würde (z.B. sehr helles kleines Objekt in weiter Ferne, welches durch Ray-Sampling übersehen werden könnte oder stark flackert bei Bewegung).
Aber ich mag mich im Detail täuschen, er hatte das mal beim Stammtisch vorgestellt, aber wahrscheinlich hatte ich nur 10% seiner Ausführungen wirklich verstanden ;) Denn so wie ich es hier zu erklären versuche fühle ich da mehr Probleme als Lösungen aufpoppen.
- Schrompf
- Moderator
- Beiträge: 4657
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [Projekt] Rayworld-NG
Ja, joeydee hat schon den Finger drauf. Ich hab ja versucht, einen "Strahl mit Dicke" durch eine Voxelwelt zu schießen und dabei auszurechnen, wieviel jeder getroffene Voxel die Farbe des Strahls verändert. Also kein bool "Getroffen oder nicht", sondern anteilig "43% des Strahls nehmen die Farbe Orange an". Und bei Dir, der Du prinzipiell nur in 2D traced, Deine Strahlen-Oberfläche also effektiv nur eindimensional ist (nur eine Breite hat), müsste man das ziemlich einfach berechnen können.
Der "Strahl mit Breite" trifft ne Wand - wenn die ganze Strahlbreite das Wandsegment trifft, kannst Du die Textur einfach aus ner MipMap entsprechend der Strahlbreite sampeln - hast ja aber gar keine Texturen bisher :-) Du kannst als Reflektion von da aus einfach einen entsprechend ab Start breiten Strahl tracen. Du kannst als Brechung nen entsprechend schmaleren Strahl weitertracen. Und wenn Du anteilig ne Wand triffst, kannst Du einfach nen Reststrahl mit reduzierter Breite weitertracen und die Oberfläche mit nem anteilig versetzten schmaleren Strahl behandeln.
Und Du kannst diffuse Reflektionen bequem mit nem entsprechend breiteren Strahl behandeln. Da kriegt man dann zwar nicht die korrekte Specular-Verteilung, aber ich habe so den Verdacht, dass im eindimensionalen Fall das Integral vielleicht sogar lösbar ist.
Soooo viele Möglichkeiten :-)
Der "Strahl mit Breite" trifft ne Wand - wenn die ganze Strahlbreite das Wandsegment trifft, kannst Du die Textur einfach aus ner MipMap entsprechend der Strahlbreite sampeln - hast ja aber gar keine Texturen bisher :-) Du kannst als Reflektion von da aus einfach einen entsprechend ab Start breiten Strahl tracen. Du kannst als Brechung nen entsprechend schmaleren Strahl weitertracen. Und wenn Du anteilig ne Wand triffst, kannst Du einfach nen Reststrahl mit reduzierter Breite weitertracen und die Oberfläche mit nem anteilig versetzten schmaleren Strahl behandeln.
Und Du kannst diffuse Reflektionen bequem mit nem entsprechend breiteren Strahl behandeln. Da kriegt man dann zwar nicht die korrekte Specular-Verteilung, aber ich habe so den Verdacht, dass im eindimensionalen Fall das Integral vielleicht sogar lösbar ist.
Soooo viele Möglichkeiten :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: [Projekt] Rayworld-NG
Ah, okay, danke euch beiden für die Erklärungen. Ich werde es mal genauer durchdenken, aber so langsam muss ich auch die GUI erweitern, um den Map-Editor angehen zu können.
@Schrompf: Doch, doch, Texturen sind auf jedem Block. Das sind aber sehr subtile und naive brushed-metal-Imitationen, die in 2min in Gimp entstanden sind, einfach mal die Bilder in groß anschauen. Ich hänge aber auch nochmal einen Screenshot mit offensichtlicherer Textur an.
@Schrompf: Doch, doch, Texturen sind auf jedem Block. Das sind aber sehr subtile und naive brushed-metal-Imitationen, die in 2min in Gimp entstanden sind, einfach mal die Bilder in groß anschauen. Ich hänge aber auch nochmal einen Screenshot mit offensichtlicherer Textur an.
Re: [Projekt] Rayworld-NG
In der letzten Zeit habe ich mich nochmal ein wenig der GUI gewidmet, zum einen, weil ich gerade Lust darauf hatte, zum anderen sollte früher oder später ein Level-/Map-Editor integriert werden.
Bislang waren die Overlays einfach nur Rechtecke mit Text. Ein paar Features sind hinzugekommen:
Bislang waren die Overlays einfach nur Rechtecke mit Text. Ein paar Features sind hinzugekommen:
- Title und entsprechende Parameter wie das Alignment (links, zentriert, rechts)
- Alignment des Overlays (zentriert oder zum Bildschirmrand)
- Diverse Eigentschaften wie Randbereiche zwischen Widget und Overlay
- Auto-resize zum Anpassen an den Widget-Inhalt
- Word- (oder eher Char-)Wrap, falls kein Auto-Resize gewählt ist
- Nur vertikales Auto-Resize und Word-Wrap ist möglich
- Wahlweise snapping an den Bildschirmrändern und in der Mitte
- Sortieren und Hervorheben/Fokussieren von Overlays