Frage: Vertex Shader Nodes #78

Closed
opened 2026-09-13 15:11:59 +02:00 by admin · 1 comment

Mit #77 ist ein eigener Vertex Shader zum Einsatz gekommen. Abklären ob wir vielleicht passende Nodes für den Shader Graph einfügen können, z.b. um die UVs zu manipulieren

Mit #77 ist ein eigener Vertex Shader zum Einsatz gekommen. Abklären ob wir vielleicht passende Nodes für den Shader Graph einfügen können, z.b. um die UVs zu manipulieren
admin added this to the Development project 2026-09-13 15:11:59 +02:00
admin moved this to Next in Development on 2026-09-13 15:12:06 +02:00
admin added the shader label 2026-09-13 15:35:02 +02:00
Owner

Befund und Bau (geschlossen mit f856064, Wiki 288e156)

Klärung: Vertex-Nodes geben hier fast nichts her

Der Vertex-Stage aus #77 ist ein Unit-Quad mit vier Ecken (UNIT_QUAD, positions = uvs = 0..1). Er macht zwei Dinge: Matrix und vTextureCoord = aUV durchreichen. Echte Vertex-Nodes könnten nur die vier Ecken verschieben (Scheren, Strecken, Versetzen) — das kann ein Behavior über width/height/Position heute schon. Eine Welle oder ein Flattern bräuchte ein unterteiltes Gitter pro Sprite plus einen zweiten Compiler-Rahmen (eigene Eingänge, Varyings, zweiter Output). Und alles Pixelgenaue bleibt ohnehin Fragment-Sache: die beiden Wege sind additiv, nicht alternativ.

„UVs manipulieren“ ist Fragment-Arbeit. Der Prelude sampelte den Texel fest vor dem Graphen; der Graph sah keine Koordinate. Das ist jetzt anders. Vertex-Nodes sind als #79 (shader, low-priority) festgehalten und rücken nach vorn, sobald ein Effekt Pixel außerhalb des Sprite-Rechtecks braucht — der kleine Bau verbaut dafür nichts (UV liest vTextureCoord; was ein späterer Vertex-Graph dort hineinschreibt, kommt automatisch an).

Gebaut

Node Bedeutung
UV u, v des Pixels, 0..1 (u links→rechts, v oben→unten); zwei Floats statt vec2, passt in die vorhandene Float-Mathe
Sample texture die Textur an u, v; unverbunden der eigene Pixel (Hook unfed am Node-Def), getönt wie Texture color
Texture size Breite/Höhe in Texeln (textureSize)
Time Sekunden seit Editor-Start; Uniform nur, wenn ein Time-Node den Output erreicht
Sin, Floor, Fract, Step per Kanal auch für Farben
Edge am Output Mirror (Default = bisheriges Verhalten), Repeat, Clamp; eine Einstellung pro Graph, weil der Sampler-Zustand einer pro Draw ist

Scene-Tab: Ein Viewport, der einen Time-Shader gezeichnet hat, zeichnet per Ticker nach (animate() aus Editor.tick, Scene- und Game-View); der runtime-Handler tritt dann zurück. Rezepte im Wiki Shaders, Abschnitt Coordinates and time: Flip, Scroll, Welle, Pixelate, Scanlines.

Drei Fallen, die erst die Messung gezeigt hat

  1. Pixi kompiliert nur als GLSL ES 3.00, wenn das Fragment #version 300 es enthält (GlProgram: isES300 = fragment.indexOf(…)). Ohne die Zeile lief alles als ES 1.00 mit #define texture texture2D; textureSize fand keine Überladung, das Programm linkte nicht, der Sprite zeichnete gar nichts (Hintergrundpixel #22252c). Der Compiler setzt die Zeile jetzt als erste.
  2. WebGL bindet keine TextureStyle-Ressource des Shaders (0 Treffer im GL-Pfad; der Sampler kommt aus source.style). Edge ist deshalb eine zweite Textur-Variante in TextureLibrary.get(ref, edge).
  3. at gab es in Schritt 28 schon; der Pixel-Helfer heißt pixel.

Beweis

./check.sh === CHECK EXIT 0 ===, 857 Tests (854 + 3)
e2e Modul 28 ALL PASSED – 49 Checks (37 + 12) gegen das finale Bundle; nichts in src/tests/tools/e2e jünger als das Log
Pixel Step auf u: links #ff0000, rechts #0000ff; auf v oben rot, unten blau. Eingeklebte 32-px-Textur: 1-u tauscht die Hälften; u+0.5 mit Repeat rechts wieder rot, mit Mirror grün; Texture size ≥ 31,5 blau, ≥ 32,5 rot; Uhr 0,2 s rot, 0,7 s blau; losgelassen ändert sich der Pixel zwischen zwei Lesungen ohne laufende Welt (animates.scene = true), Game-View animiert im Play, aus → false

Gegenproben, jede beißt an ihrer Stelle: unfed am Sample-Node entfernt → genau der Flip-Unit-Test fällt. animate() stumpf und Repeat-Variante auf mirror-repeat gebogen, neu gebaut → 3 FAILs (Repeat, „released“, „Time held“), die anderen 46 grün; Rückbau → md5-identisches Bundle. Die #version-Zeile hat ihre Gegenprobe im ersten Lauf: derselbe Code ohne sie war der FAIL oben.

Zähler 742 (CI-Lauf 20 gemessen 730 + 12), CI misst nach dem Push.

## Befund und Bau (geschlossen mit `f856064`, Wiki `288e156`) ### Klärung: Vertex-Nodes geben hier fast nichts her Der Vertex-Stage aus #77 ist ein **Unit-Quad mit vier Ecken** (`UNIT_QUAD`, positions = uvs = 0..1). Er macht zwei Dinge: Matrix und `vTextureCoord = aUV` durchreichen. Echte Vertex-Nodes könnten nur die vier Ecken verschieben (Scheren, Strecken, Versetzen) — das kann ein Behavior über `width`/`height`/Position heute schon. Eine Welle oder ein Flattern bräuchte ein unterteiltes Gitter pro Sprite plus einen zweiten Compiler-Rahmen (eigene Eingänge, Varyings, zweiter Output). Und alles Pixelgenaue bleibt ohnehin Fragment-Sache: die beiden Wege sind additiv, nicht alternativ. **„UVs manipulieren“ ist Fragment-Arbeit.** Der Prelude sampelte den Texel fest vor dem Graphen; der Graph sah keine Koordinate. Das ist jetzt anders. Vertex-Nodes sind als #79 (`shader`, `low-priority`) festgehalten und rücken nach vorn, sobald ein Effekt Pixel *außerhalb* des Sprite-Rechtecks braucht — der kleine Bau verbaut dafür nichts (`UV` liest `vTextureCoord`; was ein späterer Vertex-Graph dort hineinschreibt, kommt automatisch an). ### Gebaut | Node | Bedeutung | |---|---| | `UV` | `u`, `v` des Pixels, 0..1 (u links→rechts, v oben→unten); zwei Floats statt `vec2`, passt in die vorhandene Float-Mathe | | `Sample texture` | die Textur an `u`, `v`; unverbunden der eigene Pixel (Hook `unfed` am Node-Def), getönt wie `Texture color` | | `Texture size` | Breite/Höhe in Texeln (`textureSize`) | | `Time` | Sekunden seit Editor-Start; Uniform nur, wenn ein Time-Node den Output erreicht | | `Sin`, `Floor`, `Fract`, `Step` | per Kanal auch für Farben | | Edge am `Output` | Mirror (Default = bisheriges Verhalten), Repeat, Clamp; eine Einstellung pro Graph, weil der Sampler-Zustand einer pro Draw ist | **Scene-Tab:** Ein Viewport, der einen Time-Shader gezeichnet hat, zeichnet per Ticker nach (`animate()` aus `Editor.tick`, Scene- und Game-View); der `runtime`-Handler tritt dann zurück. Rezepte im Wiki *Shaders*, Abschnitt *Coordinates and time*: Flip, Scroll, Welle, Pixelate, Scanlines. ### Drei Fallen, die erst die Messung gezeigt hat 1. **Pixi kompiliert nur als GLSL ES 3.00, wenn das Fragment `#version 300 es` enthält** (`GlProgram`: `isES300 = fragment.indexOf(…)`). Ohne die Zeile lief alles als ES 1.00 mit `#define texture texture2D`; `textureSize` fand keine Überladung, das Programm linkte nicht, der Sprite zeichnete gar nichts (Hintergrundpixel `#22252c`). Der Compiler setzt die Zeile jetzt als erste. 2. **WebGL bindet keine `TextureStyle`-Ressource des Shaders** (0 Treffer im GL-Pfad; der Sampler kommt aus `source.style`). Edge ist deshalb eine zweite Textur-Variante in `TextureLibrary.get(ref, edge)`. 3. `at` gab es in Schritt 28 schon; der Pixel-Helfer heißt `pixel`. ### Beweis | | | |---|---| | `./check.sh` | `=== CHECK EXIT 0 ===`, **857 Tests** (854 + 3) | | e2e Modul 28 | **ALL PASSED – 49 Checks** (37 + 12) gegen das finale Bundle; nichts in `src`/`tests`/`tools/e2e` jünger als das Log | | Pixel | Step auf `u`: links `#ff0000`, rechts `#0000ff`; auf `v` oben rot, unten blau. Eingeklebte 32-px-Textur: `1-u` tauscht die Hälften; `u+0.5` mit Repeat rechts wieder rot, mit Mirror grün; `Texture size` ≥ 31,5 blau, ≥ 32,5 rot; Uhr 0,2 s rot, 0,7 s blau; losgelassen ändert sich der Pixel zwischen zwei Lesungen ohne laufende Welt (`animates.scene = true`), Game-View animiert im Play, aus → `false` | **Gegenproben, jede beißt an ihrer Stelle:** `unfed` am Sample-Node entfernt → genau der Flip-Unit-Test fällt. `animate()` stumpf und Repeat-Variante auf mirror-repeat gebogen, neu gebaut → 3 FAILs (Repeat, „released“, „Time held“), die anderen 46 grün; Rückbau → md5-identisches Bundle. Die `#version`-Zeile hat ihre Gegenprobe im ersten Lauf: derselbe Code ohne sie war der FAIL oben. Zähler 742 (CI-Lauf 20 gemessen 730 + 12), CI misst nach dem Push.
admin moved this to Done in Development on 2026-09-13 16:19:16 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#78