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
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
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.
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).
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.
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.
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
Befund und Bau (geschlossen mit
f856064, Wiki288e156)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 undvTextureCoord = aUVdurchreichen. Echte Vertex-Nodes könnten nur die vier Ecken verschieben (Scheren, Strecken, Versetzen) — das kann ein Behavior überwidth/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 (UVliestvTextureCoord; was ein späterer Vertex-Graph dort hineinschreibt, kommt automatisch an).Gebaut
UVu,vdes Pixels, 0..1 (u links→rechts, v oben→unten); zwei Floats stattvec2, passt in die vorhandene Float-MatheSample textureu,v; unverbunden der eigene Pixel (Hookunfedam Node-Def), getönt wieTexture colorTexture sizetextureSize)TimeSin,Floor,Fract,StepOutputScene-Tab: Ein Viewport, der einen Time-Shader gezeichnet hat, zeichnet per Ticker nach (
animate()ausEditor.tick, Scene- und Game-View); derruntime-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
#version 300 esenthält (GlProgram:isES300 = fragment.indexOf(…)). Ohne die Zeile lief alles als ES 1.00 mit#define texture texture2D;textureSizefand keine Überladung, das Programm linkte nicht, der Sprite zeichnete gar nichts (Hintergrundpixel#22252c). Der Compiler setzt die Zeile jetzt als erste.TextureStyle-Ressource des Shaders (0 Treffer im GL-Pfad; der Sampler kommt aussource.style). Edge ist deshalb eine zweite Textur-Variante inTextureLibrary.get(ref, edge).atgab es in Schritt 28 schon; der Pixel-Helfer heißtpixel.Beweis
./check.sh=== CHECK EXIT 0 ===, 857 Tests (854 + 3)src/tests/tools/e2ejünger als das Logu: links#ff0000, rechts#0000ff; aufvoben rot, unten blau. Eingeklebte 32-px-Textur:1-utauscht die Hälften;u+0.5mit 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 →falseGegenproben, jede beißt an ihrer Stelle:
unfedam 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.