8ddbd6f514f8b30368242180d79f162f568c7116
Erster Effekt, der das Bild verändert. Gesucht werden Kanten der Geometrie, nicht des Bildes — auf dem fertigen Bild zu suchen wäre falsch, weil der Dither Flächen in Muster zerlegt und jede Texturkante als Kante zählte. Drei unabhängige Signale, genommen wird das stärkste: Tiefe (Silhouetten) und Normale (Knicke) über einen 3x3-Sobel, die Objekt-ID über einen Vergleich mit den direkten Nachbarn. Läuft vor dither, damit die Linie mitquantisiert wird wie alles andere. Zwei Vorarbeiten, die nur für diesen Pass existieren und deshalb hier mit drinstehen: Der Post-Vertrag bekommt group 2 mit Uniforms (inv_res, near, far, time). Das räumt near/far aus normals.wgsl heraus, wo ich sie als Literale abgeschrieben hatte — der Debug-View hätte stillschweigend gelogen, sobald jemand die Projektion ändert, ausgerechnet das Werkzeug, dem man beim Debuggen glauben muss. Sie kommen jetzt aus NEAR_FAR in gpu.rs, derselben Konstante wie die Projektion. time ist Vorrat für animierte Effekte; jetzt mitgenommen, weil eine spätere Vertragsänderung alle Bind-Group-Layouts anfasst. Die Objektnummer füllt das reservierte Alpha des Normal-Buffers. Sie läuft fortlaufend statt als Namens-Hash: benachbarte Nummern unterscheiden sich damit garantiert, ein Hash hätte mit ~1/256 still kollidiert. Mesh::append verschiebt die Nummern des Anhängsels, sonst trügen die ersten Objekte zweier .glb dieselbe und die Kante zwischen ihnen fehlte. Ab 1, damit die 0 "kein Objekt" heißt — der Outline-Pass zeichnet auf dem Hintergrund nichts, sonst läge jede Silhouette doppelt. Nicht getrennt committet, weil Uniform und ID für sich nichts leisten: vor diesem Pass liest sie niemand außer dem Debug-View. Strichstärke geht über den Abtastabstand des Kernels (WIDTH, aktuell 2) statt über nachträgliches Aufdicken — das kostet keinen zusätzlichen Texturzugriff, wo Dilatation das Neunfache gebraucht hätte. Die Gradienten werden durch den Abstand geteilt, damit die Schwellwerte beim Breitenwechsel ihre Bedeutung behalten. DEPTH_T und NORMAL_T sind aus der Kernel-Normierung hergeleitet, nicht an der Szene erprobt; Fehlerbilder und Richtung stehen als Kommentar daneben. normals.wgsl zeigt jetzt drei Bänder (Normale, ID, Tiefe). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Weirdcore Dating Simulator
Anwendung ausführen
Das Projekt nutzt Rust-Edition 2024 und braucht daher eine aktuelle
Toolchain (Rust ≥ 1.85). Das cargo aus den Distributions-Paketquellen
(apt) ist dafür in der Regel zu alt — stattdessen Rust über
rustup installieren:
- Rust installieren (falls noch nicht vorhanden):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh(danach neue Shell öffnen odersource "$HOME/.cargo/env") - Repository klonen:
git clone https://git.bnd.wtf/irrlicht/wds.git - In den Ordner wechseln:
cd wds - Anwendung bauen und ausführen:
cargo run
Alternativ ohne Fenster/GPU in der Konsole: cargo run -- --cli
Languages
Rust
78.1%
Ink
16.3%
WGSL
4%
Shell
1.6%