Particles: Feld-Shader über die ganze Quelle (Glow über die Quads hinaus) #170

Closed
opened 2026-09-19 11:41:52 +02:00 by meleki · 2 comments
Owner

Aus #88 („Nicht gebaut: der Feld-Filter (feldweiter Glow über die Quad-Kanten hinaus) — das wäre ein Pass über eine große Fläche und damit das Gegenteil von gratis. Eigenes Issue, falls gewünscht.“).

Befund

  • Ein Shader an einer Partikel-Quelle wirkt pro Partikel und nur innerhalb des Partikel-Quads. Ein Glow oder Blur, der über die Quads hinaus das ganze Feld erfasst, geht nicht.

Zu bauen (Vorschlag)

  • Zweite Einstellung an der Quelle: Field shader, als Filter über den Container der ganzen Quelle, mit Padding.
  • Messung wie in #67: Kosten pro Frame bei 1, 10 und 50 Quellen mit Feld-Shader.

Offen (mit Vorschlag)

  1. Lohnt sich das vor #69 (Filterbereich endet am Sprite-Rechteck)? Vorschlag: nein, beide brauchen dasselbe Padding — zusammen bauen oder #69 zuerst.
Aus #88 („Nicht gebaut: der Feld-Filter (feldweiter Glow über die Quad-Kanten hinaus) — das wäre ein Pass über eine große Fläche und damit das Gegenteil von gratis. Eigenes Issue, falls gewünscht.“). ## Befund - Ein Shader an einer Partikel-Quelle wirkt pro Partikel und nur innerhalb des Partikel-Quads. Ein Glow oder Blur, der über die Quads hinaus das ganze Feld erfasst, geht nicht. ## Zu bauen (Vorschlag) - Zweite Einstellung an der Quelle: **Field shader**, als Filter über den Container der ganzen Quelle, mit Padding. - Messung wie in #67: Kosten pro Frame bei 1, 10 und 50 Quellen mit Feld-Shader. ## Offen (mit Vorschlag) 1. **Lohnt sich das vor #69 (Filterbereich endet am Sprite-Rechteck)?** Vorschlag: nein, beide brauchen dasselbe Padding — zusammen bauen oder #69 zuerst.
meleki added the new label 2026-09-19 11:41:52 +02:00
admin added held-back and removed new labels 2026-09-19 11:52:00 +02:00
admin added this to the Development project 2026-09-19 11:52:03 +02:00
admin moved this to Held back in Development on 2026-09-19 11:52:05 +02:00

Ja, ich denke wir bauen zuerst #69 - danach machen wir hier weiter

Ja, ich denke wir bauen zuerst #69 - danach machen wir hier weiter
admin moved this to Next in Development on 2026-10-03 11:50:17 +02:00
admin moved this to Done in Development on 2026-10-03 12:24:39 +02:00
Author
Owner

Gebaut in d6d38a6, Wiki 315ee92 (Particles → „A shader over the whole field“, Shaders → Messung).

Entscheidungen (aus den Rückfragen)

  1. Form: zweite Zeile Field shader an der Partikelquelle, unter der bestehenden Shader-Zeile. Ein ganz normales Shader-Asset, seine Property- und Color property-Nodes werden zu Zeilen an der Quelle.
  2. Fläche: fester Rahmen Field width x Field height in Einheiten, mittig um die Quelle, Standard 256 x 256. Die UV laufen 0 bis 1 über den Rahmen und springen nie. Was hinausfliegt, wird abgeschnitten. Ein eigenes Padding gibt es nicht, der Rahmen ist der Rand.
  3. Bild-Nodes: Das Feldbild ist die Textur. Texture color/Texture alpha lesen die Wolke an der eigenen Stelle, Sample texture an beliebiger UV, Texture size ist das Feldbild in Pixeln.
  4. Auflösung: Bildschirmpixel, wie der Rahmen gerade auf dem Bildschirm steht, höchstens 2048 je Seite. Eine Quelle, deren Rahmen außerhalb des Bildes liegt, zeichnet keinen Durchgang.

Wie es gebaut ist

  • Kein Pixi-Filter (den gibt es seit #77 nicht mehr): Die Partikel werden in eine eigene RenderTexture in Rahmengröße gezeichnet, darüber liegt ein Mesh wie bei einem Sprite, das den Feld-Shader trägt.
  • Der Rahmen dreht und skaliert mit der Quelle.
  • Der Shader je Partikel und der Feld-Shader gehen zusammen: Der eine zeichnet ins Bild, der andere darüber.

Was ich selbst festgelegt habe

  • Vertex output und Padding im Feld-Shader wirken nicht, ohne Meldung. In Frage 3 stand „meldet ein Problem, wie bei 9-Slice und Partikeln“. 9-Slice und Partikel melden aber auch nichts, sie zeichnen so, als gäbe es den Node nicht. Ein Shader-Asset weiß nicht, wo es getragen wird, deshalb gibt es keinen Ort für eine Meldung. So steht es auch im Wiki.
  • Ein Name, den beide Shader deklarieren, ist eine Zeile, und beide Uniforms lesen sie.
  • Field width/Field height erscheinen nur, solange ein Feld-Shader gewählt ist.
  • Die Scene View zeichnet den Rahmen gestrichelt um die ausgewählte Quelle.
  • Die Vorschau im Partikel-Tab zeichnet den Feld-Shader auch.

Performance (stein2, Intel HD 630, Bilder je Sekunde)

tools/perf-field-shaders.mjs, Quellen über die 640x360-Kamera verteilt, Rahmen 256 (= 256 x 256 Pixel bei diesem Zoom), 50 Partikel je Sekunde, Feld-Shader reicht das Bild unverändert durch:

Quellen 1 10 50
ohne Feld-Shader 60.1 60.0 59.2
mit Feld-Shader 60.0 60.0 57.6
  • Ein Lauf je Zeile, nicht drei.
  • Die 60-Hz-Grenze verdeckt, was ein Durchgang in einem nicht vollen Frame kostet.
  • Ein Graph, der das Bild oft liest (Blur), kostet je Pixel zusätzlich. Das ist nicht gemessen.

Tests

Gate  → 223 Files, 3460 Tests, CHECK EXIT 0   (3452 + 8)
e2e 31 → ALL PASSED – 43 checks (3 neu)
  • 8 neue Unit-Tests: Zeilen, geteilter Name, Override am Objekt, Speichern, Rahmenrechnung (Pixel, Drehung, Grenzen).
  • 3 neue e2e-Checks (31v):
    • Ein Feld-Shader, der nichts ändert, zeichnet das Feld an derselben Stelle und richtig herum (Burst nach 0,3 s 36 Einheiten unter der Quelle). Das Bild hat 256 Pixel.
    • Ein flaches Rot füllt den Rahmen 100 Einheiten neben der Quelle, wo kein Partikel ist, und endet vor 140.
    • Wieder abgewählt, zeichnen die Partikel wie vorher.
  • Eine Unit-Gegenprobe greift: Ohne die Zeilen des Feld-Shaders fallen 3 Tests.
  • Die e2e-Summe 1707 ist gerechnet (1704 + 3).
  • Nicht im Browser geprüft: ein echter Glow oder Blur mit Sample texture, Drehung und Skalierung der Quelle, die Vorschau im Partikel-Tab, der gestrichelte Rahmen in der Scene View, die 2048-Grenze, ein Rahmen außerhalb des Bildes, alles nach dem Build.
Gebaut in `d6d38a6`, Wiki `315ee92` (*Particles* → „A shader over the whole field“, *Shaders* → Messung). ## Entscheidungen (aus den Rückfragen) 1. **Form:** zweite Zeile `Field shader` an der Partikelquelle, unter der bestehenden Shader-Zeile. Ein ganz normales Shader-Asset, seine `Property`- und `Color property`-Nodes werden zu Zeilen an der Quelle. 2. **Fläche:** fester Rahmen `Field width` x `Field height` in Einheiten, mittig um die Quelle, Standard 256 x 256. Die UV laufen 0 bis 1 über den Rahmen und springen nie. Was hinausfliegt, wird abgeschnitten. Ein eigenes Padding gibt es nicht, der Rahmen ist der Rand. 3. **Bild-Nodes:** Das Feldbild ist die Textur. `Texture color`/`Texture alpha` lesen die Wolke an der eigenen Stelle, `Sample texture` an beliebiger UV, `Texture size` ist das Feldbild in Pixeln. 4. **Auflösung:** Bildschirmpixel, wie der Rahmen gerade auf dem Bildschirm steht, höchstens 2048 je Seite. Eine Quelle, deren Rahmen außerhalb des Bildes liegt, zeichnet keinen Durchgang. ## Wie es gebaut ist - Kein Pixi-Filter (den gibt es seit #77 nicht mehr): Die Partikel werden in eine eigene RenderTexture in Rahmengröße gezeichnet, darüber liegt ein Mesh wie bei einem Sprite, das den Feld-Shader trägt. - Der Rahmen dreht und skaliert mit der Quelle. - Der Shader je Partikel und der Feld-Shader gehen zusammen: Der eine zeichnet ins Bild, der andere darüber. ## Was ich selbst festgelegt habe - **`Vertex output` und `Padding` im Feld-Shader wirken nicht, ohne Meldung.** In Frage 3 stand „meldet ein Problem, wie bei 9-Slice und Partikeln“. 9-Slice und Partikel melden aber auch nichts, sie zeichnen so, als gäbe es den Node nicht. Ein Shader-Asset weiß nicht, wo es getragen wird, deshalb gibt es keinen Ort für eine Meldung. So steht es auch im Wiki. - **Ein Name, den beide Shader deklarieren, ist eine Zeile**, und beide Uniforms lesen sie. - **`Field width`/`Field height` erscheinen nur, solange ein Feld-Shader gewählt ist.** - **Die Scene View zeichnet den Rahmen gestrichelt** um die ausgewählte Quelle. - **Die Vorschau im Partikel-Tab** zeichnet den Feld-Shader auch. ## Performance (stein2, Intel HD 630, Bilder je Sekunde) `tools/perf-field-shaders.mjs`, Quellen über die 640x360-Kamera verteilt, Rahmen 256 (= 256 x 256 Pixel bei diesem Zoom), 50 Partikel je Sekunde, Feld-Shader reicht das Bild unverändert durch: | Quellen | 1 | 10 | 50 | | --- | --- | --- | --- | | ohne Feld-Shader | 60.1 | 60.0 | 59.2 | | mit Feld-Shader | 60.0 | 60.0 | 57.6 | - Ein Lauf je Zeile, nicht drei. - Die 60-Hz-Grenze verdeckt, was ein Durchgang in einem nicht vollen Frame kostet. - Ein Graph, der das Bild oft liest (Blur), kostet je Pixel zusätzlich. Das ist nicht gemessen. ## Tests ``` Gate → 223 Files, 3460 Tests, CHECK EXIT 0 (3452 + 8) e2e 31 → ALL PASSED – 43 checks (3 neu) ``` - **8 neue Unit-Tests:** Zeilen, geteilter Name, Override am Objekt, Speichern, Rahmenrechnung (Pixel, Drehung, Grenzen). - **3 neue e2e-Checks (31v):** - Ein Feld-Shader, der nichts ändert, zeichnet das Feld an derselben Stelle und richtig herum (Burst nach 0,3 s 36 Einheiten unter der Quelle). Das Bild hat 256 Pixel. - Ein flaches Rot füllt den Rahmen 100 Einheiten neben der Quelle, wo kein Partikel ist, und endet vor 140. - Wieder abgewählt, zeichnen die Partikel wie vorher. - Eine Unit-Gegenprobe greift: Ohne die Zeilen des Feld-Shaders fallen 3 Tests. - Die e2e-Summe **1707** ist gerechnet (1704 + 3). - **Nicht im Browser geprüft:** ein echter Glow oder Blur mit `Sample texture`, Drehung und Skalierung der Quelle, die Vorschau im Partikel-Tab, der gestrichelte Rahmen in der Scene View, die 2048-Grenze, ein Rahmen außerhalb des Bildes, alles nach dem Build.
admin removed the held-back label 2026-10-08 21:46:41 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#170