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)
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
Gebaut in d6d38a6, Wiki 315ee92 (Particles → „A shader over the whole field“, Shaders → Messung).
Entscheidungen (aus den Rückfragen)
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.
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.
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.
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
Zu bauen (Vorschlag)
Offen (mit Vorschlag)
Ja, ich denke wir bauen zuerst #69 - danach machen wir hier weiter
Gebaut in
d6d38a6, Wiki315ee92(Particles → „A shader over the whole field“, Shaders → Messung).Entscheidungen (aus den Rückfragen)
Field shaderan der Partikelquelle, unter der bestehenden Shader-Zeile. Ein ganz normales Shader-Asset, seineProperty- undColor property-Nodes werden zu Zeilen an der Quelle.Field widthxField heightin 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.Texture color/Texture alphalesen die Wolke an der eigenen Stelle,Sample texturean beliebiger UV,Texture sizeist das Feldbild in Pixeln.Wie es gebaut ist
Was ich selbst festgelegt habe
Vertex outputundPaddingim 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.Field width/Field heighterscheinen nur, solange ein Feld-Shader gewählt ist.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:Tests
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.