Anti-Jammer-Thread
Re: Anti-Jammer-Thread
Ja, ich arbeite noch an den Ergebnissen.
Zu den Quads: Hier gibt es eine Übersicht, nach welchen Mustern Tessellation zusätzliche Geometrie erzeugt: https://www.khronos.org/opengl/wiki/Tes ... primitives
Gibt man statt Vierecken jeweils zwei Dreiecke rein, kriegt man also eine ganz andere Verteilung heraus (weniger gleichmäßig, und abhängig davon, welche der zwei möglichen Diagonalen benutzt wird). Lustigerweise produziert aber auch der Quad-Tessellation-Modus am Ende bloß Dreiecke, aber halt im Quad-Layout. Und will man dieses "schöne" Layout haben (wollte ich) müssen vorne halt Quads reingeschmissen werden (nur der Indexbuffer ändert sich). Und um sicher zu stellen, dass immer die richtigen 2 Dreiecke zu einem Quad werden, sollte das Layout halt schon vor dem Export in Blender definiert sein, sprich Quads all the way through.
Gut, heutzutage ist Tessellation vielleicht selbst überholt und man sollte Nanite oder ähnliches verwenden. Aber das bau ich jetzt nicht mal eben so nach...
Zu den Quads: Hier gibt es eine Übersicht, nach welchen Mustern Tessellation zusätzliche Geometrie erzeugt: https://www.khronos.org/opengl/wiki/Tes ... primitives
Gibt man statt Vierecken jeweils zwei Dreiecke rein, kriegt man also eine ganz andere Verteilung heraus (weniger gleichmäßig, und abhängig davon, welche der zwei möglichen Diagonalen benutzt wird). Lustigerweise produziert aber auch der Quad-Tessellation-Modus am Ende bloß Dreiecke, aber halt im Quad-Layout. Und will man dieses "schöne" Layout haben (wollte ich) müssen vorne halt Quads reingeschmissen werden (nur der Indexbuffer ändert sich). Und um sicher zu stellen, dass immer die richtigen 2 Dreiecke zu einem Quad werden, sollte das Layout halt schon vor dem Export in Blender definiert sein, sprich Quads all the way through.
Gut, heutzutage ist Tessellation vielleicht selbst überholt und man sollte Nanite oder ähnliches verwenden. Aber das bau ich jetzt nicht mal eben so nach...
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Godot will mich doch noch haben! Ich bin in der engeren Auswahl!
Godot hat ne Stiftung dahinter und bissl finanziellen Spielraum. Daher haben sie vor paar Monaten nach nem Coder gesucht, der auf Rechnungsbasis daran mitarbeitet. Ich hab mich damals beworben, hab ja schon einiges an OpenSource gemacht und hab 30 Jahre on and off Erfahrung mit 3DEngine-Entwicklung. Aber die haben halt auch jetzt schon viele Dutzend Freizeitcoder, die bei jedem Release aushelfen. Und daher hat es mich gar nicht gewundert, dass ich jetzt monatelang gar nix mehr von denen gehört habe.
Bis gerade eben 🥰
Godot hat ne Stiftung dahinter und bissl finanziellen Spielraum. Daher haben sie vor paar Monaten nach nem Coder gesucht, der auf Rechnungsbasis daran mitarbeitet. Ich hab mich damals beworben, hab ja schon einiges an OpenSource gemacht und hab 30 Jahre on and off Erfahrung mit 3DEngine-Entwicklung. Aber die haben halt auch jetzt schon viele Dutzend Freizeitcoder, die bei jedem Release aushelfen. Und daher hat es mich gar nicht gewundert, dass ich jetzt monatelang gar nix mehr von denen gehört habe.
Bis gerade eben 🥰
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Anti-Jammer-Thread
Sehr geil! Gratulation!
-
- Establishment
- Beiträge: 493
- Registriert: 01.03.2009, 19:09
Re: Anti-Jammer-Thread
Gratulation :) Freut mich für dich!
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: Anti-Jammer-Thread
Glückwünsche, hoffe Du kriegst den Job.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Re: Anti-Jammer-Thread
Sehr cool, ich drück die Daumen!Schrompf hat geschrieben: ↑15.08.2024, 21:13 Godot will mich doch noch haben! Ich bin in der engeren Auswahl!
Godot hat ne Stiftung dahinter und bissl finanziellen Spielraum. Daher haben sie vor paar Monaten nach nem Coder gesucht, der auf Rechnungsbasis daran mitarbeitet. Ich hab mich damals beworben, hab ja schon einiges an OpenSource gemacht und hab 30 Jahre on and off Erfahrung mit 3DEngine-Entwicklung. Aber die haben halt auch jetzt schon viele Dutzend Freizeitcoder, die bei jedem Release aushelfen. Und daher hat es mich gar nicht gewundert, dass ich jetzt monatelang gar nix mehr von denen gehört habe.
Bis gerade eben 🥰
Re: Anti-Jammer-Thread
Daumen sind gedrückt, Schrompf!
Letztes Projekt: Grave of the Pumpkin (ZFX Halloween Action 2021)
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Danke, ist lieb, aber habe soeben gerade die Ablehnung erhalten. Naja, mach ich halt meinen eigenen Mist weiter
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Anti-Jammer-Thread
Fiesen Bug gefixt:
Kaputt: Richtig: Was war los? Ignorieren wir mal kurz auf der rechten Seite die Shadow-Mapping Probleme und schauen uns den linken Rand des Flusses an. Das Wasser am Ufer ist seicht, also wird es langsam transparent und es gibt keinen harten Übergang. Im kaputten Bild erkennt man aber eine sehr harte und hässliche Kante. Witzigerweise aber nur links, rechts ist der Übergang weich (wie gesagt, man muss den Schatten da erstmal ignorieren).
Die Landschaft wird von einer Heightmap per Tessellation gerendert. Das Wasser ist eine simples Viereck, und hat auch Zugriff auf die Terrain Heightmap. Aus Fragment-Position und Heightmap-Wert kann man dann sehr leicht die Wassertiefe bestimmen und den Alpha-Wert anpassen. Nun gibt es da irgendeine Art von dusseligen Offset, schaltet man das Terrain aus, sieht man, dass auch links das Wasser ausgeblendet wird, nur halt ein wenig zu spät. Mist.
Ich habe dann lange nach dem Fehler gesucht. Ich dachte, ich hätte im Tessellation irgendwo einen Offset-Bug. Denn Wasser hatte ich ja früher schon, und da funktionierte das Blending. Vielleicht ist auch die Terrain Auflösung zu niedrig, und Heightmap und Mesh haben unterschiedliche Höhen - aber eigentlich sollte ja Texturpixelinterpolation und lineare Interpolation zwischen den Vertexen des Dreiecks die selben Werte liefern. Hundert Kleinigkeiten die schief gehen könnten.
Am Ende war der Fehler mal wieder komplett woanders. Ich erstelle für das Terrain erst das Mesh zum Rendern (flach, weil ja später Tessellation kommt) und dann aus der selben Heightmap ein Triangle-Mesh für Bullet-Physics für Kollisionsbehandlung. Dabei muss ich auf die Pixel der Heigthmap zugreifen und bin entsprechend von 0 bis Auflösung-1 gegangen. Fürs Rendern hatte das Mesh aber einen Zeile und Spalte mehr (3x3 Vertexe für 2x2 Pixel der Heightmap, jajaja, ich weiß jetzt selber, dass das falsch war :P). Ok, aber was hat das Wasser mit Kollissionsabfrage zu tun? Nun, das Wassermesh wird etwas später erstellt, anhand der Größe der Landschaft, die sich aus der Bounding-Box des Kollissionsobjektes von Bullet ergibt. Die UV Koordinaten und Vertexpositionen wurden korrekt berechnet, nur war das Mesh leider 1/512 zu klein, was zu einem Mini-Offset führte, der jetzt mein Blending vom Wasser kaputt gemacht hat.
Ein richtig fieser Fehler also, einmal quer durchs gesamte Programm. Bin froh, dass ich das gefunden habe, rückblickend hätte ich daran auch noch sehr viel länger suchen können...
Kaputt: Richtig: Was war los? Ignorieren wir mal kurz auf der rechten Seite die Shadow-Mapping Probleme und schauen uns den linken Rand des Flusses an. Das Wasser am Ufer ist seicht, also wird es langsam transparent und es gibt keinen harten Übergang. Im kaputten Bild erkennt man aber eine sehr harte und hässliche Kante. Witzigerweise aber nur links, rechts ist der Übergang weich (wie gesagt, man muss den Schatten da erstmal ignorieren).
Die Landschaft wird von einer Heightmap per Tessellation gerendert. Das Wasser ist eine simples Viereck, und hat auch Zugriff auf die Terrain Heightmap. Aus Fragment-Position und Heightmap-Wert kann man dann sehr leicht die Wassertiefe bestimmen und den Alpha-Wert anpassen. Nun gibt es da irgendeine Art von dusseligen Offset, schaltet man das Terrain aus, sieht man, dass auch links das Wasser ausgeblendet wird, nur halt ein wenig zu spät. Mist.
Ich habe dann lange nach dem Fehler gesucht. Ich dachte, ich hätte im Tessellation irgendwo einen Offset-Bug. Denn Wasser hatte ich ja früher schon, und da funktionierte das Blending. Vielleicht ist auch die Terrain Auflösung zu niedrig, und Heightmap und Mesh haben unterschiedliche Höhen - aber eigentlich sollte ja Texturpixelinterpolation und lineare Interpolation zwischen den Vertexen des Dreiecks die selben Werte liefern. Hundert Kleinigkeiten die schief gehen könnten.
Am Ende war der Fehler mal wieder komplett woanders. Ich erstelle für das Terrain erst das Mesh zum Rendern (flach, weil ja später Tessellation kommt) und dann aus der selben Heightmap ein Triangle-Mesh für Bullet-Physics für Kollisionsbehandlung. Dabei muss ich auf die Pixel der Heigthmap zugreifen und bin entsprechend von 0 bis Auflösung-1 gegangen. Fürs Rendern hatte das Mesh aber einen Zeile und Spalte mehr (3x3 Vertexe für 2x2 Pixel der Heightmap, jajaja, ich weiß jetzt selber, dass das falsch war :P). Ok, aber was hat das Wasser mit Kollissionsabfrage zu tun? Nun, das Wassermesh wird etwas später erstellt, anhand der Größe der Landschaft, die sich aus der Bounding-Box des Kollissionsobjektes von Bullet ergibt. Die UV Koordinaten und Vertexpositionen wurden korrekt berechnet, nur war das Mesh leider 1/512 zu klein, was zu einem Mini-Offset führte, der jetzt mein Blending vom Wasser kaputt gemacht hat.
Ein richtig fieser Fehler also, einmal quer durchs gesamte Programm. Bin froh, dass ich das gefunden habe, rückblickend hätte ich daran auch noch sehr viel länger suchen können...
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Sowas ist echt hart zu finden. Gute Arbeit!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Anti-Jammer-Thread
Hab boost gerade als Abhängigkeit komplett entfernt.
Weil C++ nunmal so ist, wie es ist, will man ja immer möglichst wenig Abhängigkeiten haben. Und boost Speziell ist so unglaublich langsam zu kompilieren, das es echt keinen Spaß macht deren Header einzubinden. Und Vieles davon ist jetzt auch eh in der Standardbibliothek, weswegen ich jetzt als C++20 kompiliere und damit alle Features habe, die ich brauchte (Format-String, UTF8 konvertieren, Filesystem, etc.)
Aber ach, die Standardbibliothek ist auch einfach nicht schön zu benutzen. Wie bekommt man einen wstring von einem UTF8 String? So:
Weil es wäre ja viel zu einfach, wenn es dafür irgendeine Funktion gäbe, die das direkt macht. Stattdessen muss man über die Abstraktion der codecvt lernen (hab ich aber nicht, ich weiß jetzt weder was die Abkürzung bedeutet, noch was genau das sein soll), das richtige aussuchen (es gibt eine ganze Reihe davon) und dann ein Konverter-Objekt mit internen Zustand erzeugen und einmal benutzen. Weil ein wstring_from_utf8string() ja viel zu einfach und praktisch gewesen wäre, deswegen darf das nicht sein. hat mich dankt des obskuren Namens und der komischen Verwendung übrigens locker 15 Minuten gekostet, das zu finden. Meine Güte...
Tjo, war viel Arbeit mit wenig Effekt (ging ja vorher alles...) aber mir scheint ab und an muss etwas Clean-Up und Altlasten entfernen einfach sein. Über die Jahre kommt einiges Zusammen, je länger man nicht aufräumt, desto ärger wird es.
Weil C++ nunmal so ist, wie es ist, will man ja immer möglichst wenig Abhängigkeiten haben. Und boost Speziell ist so unglaublich langsam zu kompilieren, das es echt keinen Spaß macht deren Header einzubinden. Und Vieles davon ist jetzt auch eh in der Standardbibliothek, weswegen ich jetzt als C++20 kompiliere und damit alle Features habe, die ich brauchte (Format-String, UTF8 konvertieren, Filesystem, etc.)
Aber ach, die Standardbibliothek ist auch einfach nicht schön zu benutzen. Wie bekommt man einen wstring von einem UTF8 String? So:
Code: Alles auswählen
std::string text(...);
wstring_convert<std::codecvt_utf8<wchar_t>> conv;
std::wstring wtext = conv.from_bytes(text);
Tjo, war viel Arbeit mit wenig Effekt (ging ja vorher alles...) aber mir scheint ab und an muss etwas Clean-Up und Altlasten entfernen einfach sein. Über die Jahre kommt einiges Zusammen, je länger man nicht aufräumt, desto ärger wird es.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Glückwunsch! Ich (und mein Ex-Zwillingsbruder) sind auch seit Jahren schrittweise damit befasst. Signals ist schon ersetzt durch eine kleine eigene Struktur, format kann man ja recht reibungsarm mit C++20 ersetzen, boost::fcontext bau ich eh schon seit Jahren hardcore einzeln selbst, weil der Autor des Ganzen Flöhe kriegt. Hier und da gibt's noch lexical_cast, was ich vor ner Dekade mit großer Freude eingesetzt hab... das muss ich überall händisch ersetzen, das wird lästig.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Anti-Jammer-Thread
Heute mal mit den Kinder gecodet: Sie designen Räume und Missionen, ich fixe Bugs in der Usability und verbessere die Grafik
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Re: Anti-Jammer-Thread
Das klingt ziemlich cool :)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Ich habe gestern final boost aus unserem Framework entfernt. Eine Dependency weniger ist nicht nur gut für meine zukünftigen CMake-Bestrebungen, Boost ist auch in vielen Teilen ein sinnlos überdesigntes unnötig kompliziert zu nutzendes Produkt, das mir unsympathisch ist. Und ein Total Rebuild braucht jetzt noch 9s anstatt ~20s vorher. Weil wir ja seit Anbeginn der Zeit Precompiled Header einsetzen und da halt alles an Includes drin haben, was wir irgendwo brauchen könnten - und wenn man da an ner zentralen Stelle sowas komplexes wie die Boost-Header raus nehmen kann, hat das stattlichen Einfluss.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Anti-Jammer-Thread
Nice. Halbierung der Build-Zeit ist schon echt ne Hausnummer :D
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5074
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Anti-Jammer-Thread
Ich habe - mitten in der GameJam - zwei Tage debuggt, weil ich nen absurden Crash in meiner Fiber-Job-Worker-Geschichte hatte, wo ich ohne Callstack mitten im Nichts lande. Hab mich jetzt hart und lang rangeprintet, was gar nicht so einfach ist, weil mein Logger aus vielen Threads heraus Zeugs in ner Queue sammelt und dann wegschreibt, aber der Crash das verhindert hat. Aber Dank xq und WinAPI OutputDebugStringA() und echt hartnäckigem Debuggen habe ich den Fehler jetzt gefunden. Und jetzt hab ich Mosaiken an den Wänden. Allerdings noch komplett lilane, weil das Bild nicht geladen werden konnte.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.