ShaderDivide (src/core/shader/nodes.ts) emittiert (a / b) ohne Guard. Eine Property mit Default 0 an b (oder ein Wert, der zur Laufzeit auf 0 laeuft) ergibt NaN; der Epilog clamp(NaN, 0.0, 1.0) ist in GLSL undefiniert, das Ergebnis haengt vom Treiber ab (Intel, Nvidia und Handy zeigen verschiedene Pixel).
Vorschlag
Eine von beiden Richtungen, oder beide:
Guard im Divide-Emit (z. B. b == 0 ? 0 : a / b per mix/step, per Kanal bei vec3).
Ein Clamp-Node im Katalog, plus ein Satz auf der Wiki-Seite Shaders, was bei Division durch 0 passiert.
Unit-Test: der erzeugte GLSL-Text enthaelt den Guard; e2e-Pixelcheck mit b = 0 liefert einen definierten Wert.
## Befund
`ShaderDivide` (`src/core/shader/nodes.ts`) emittiert `(a / b)` ohne Guard. Eine Property mit Default 0 an `b` (oder ein Wert, der zur Laufzeit auf 0 laeuft) ergibt NaN; der Epilog `clamp(NaN, 0.0, 1.0)` ist in GLSL undefiniert, das Ergebnis haengt vom Treiber ab (Intel, Nvidia und Handy zeigen verschiedene Pixel).
## Vorschlag
Eine von beiden Richtungen, oder beide:
- Guard im `Divide`-Emit (z. B. `b == 0 ? 0 : a / b` per `mix`/`step`, per Kanal bei vec3).
- Ein `Clamp`-Node im Katalog, plus ein Satz auf der Wiki-Seite *Shaders*, was bei Division durch 0 passiert.
Unit-Test: der erzeugte GLSL-Text enthaelt den Guard; e2e-Pixelcheck mit `b = 0` liefert einen definierten Wert.
Null ist die Antwort, per Kanal bei Farben. Das war im Behavior- und im Partikel-Graphen schon
Hausregel — nur der Shader hatte sie nie bekommen. Damit ist auch clamp(NaN) kein Thema mehr,
weil gar kein NaN mehr entsteht.
Dazu, wie im Issue vorgeschlagen, ein Clamp-Node im Shader-Katalog (value, min, max,
per Kanal bei Farben); der Behavior-Katalog hatte ihn laengst.
Belegt:npm run check gruen (1090 Tests) und — das ist hier der eigentliche Beweis — ein
Pixel-Check im e2e-Schritt 28 auf echter GPU: Divide durch 2 gibt #800000, durch 0 gibt #000000 statt einer treiberabhaengigen Farbe. CI-Task 53 auf 7e5003b gruen, ALL PASSED - 930 checks.
Erledigt in `c990dbc`.
`Divide` emittiert nicht mehr `(a / b)`, sondern `divide(a, b)` — der Guard steht als Funktion im
Prolog neben `straight()` (`src/core/shader/nodes.ts:297`):
```glsl
float divide(float a, float b) { return b == 0.0 ? 0.0 : a / b; }
vec3 divide(vec3 a, vec3 b) { return vec3(divide(a.x, b.x), divide(a.y, b.y), divide(a.z, b.z)); }
```
Null ist die Antwort, per Kanal bei Farben. Das war im Behavior- und im Partikel-Graphen schon
Hausregel — nur der Shader hatte sie nie bekommen. Damit ist auch `clamp(NaN)` kein Thema mehr,
weil gar kein NaN mehr entsteht.
Dazu, wie im Issue vorgeschlagen, ein **`Clamp`-Node** im Shader-Katalog (`value`, `min`, `max`,
per Kanal bei Farben); der Behavior-Katalog hatte ihn laengst.
**Belegt:** `npm run check` gruen (1090 Tests) und — das ist hier der eigentliche Beweis — ein
Pixel-Check im e2e-Schritt 28 auf echter GPU: `Divide` durch 2 gibt `#800000`, durch **0 gibt
`#000000`** statt einer treiberabhaengigen Farbe. CI-Task 53 auf `7e5003b` gruen,
`ALL PASSED - 930 checks`.
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.
Befund
ShaderDivide(src/core/shader/nodes.ts) emittiert(a / b)ohne Guard. Eine Property mit Default 0 anb(oder ein Wert, der zur Laufzeit auf 0 laeuft) ergibt NaN; der Epilogclamp(NaN, 0.0, 1.0)ist in GLSL undefiniert, das Ergebnis haengt vom Treiber ab (Intel, Nvidia und Handy zeigen verschiedene Pixel).Vorschlag
Eine von beiden Richtungen, oder beide:
Divide-Emit (z. B.b == 0 ? 0 : a / bpermix/step, per Kanal bei vec3).Clamp-Node im Katalog, plus ein Satz auf der Wiki-Seite Shaders, was bei Division durch 0 passiert.Unit-Test: der erzeugte GLSL-Text enthaelt den Guard; e2e-Pixelcheck mit
b = 0liefert einen definierten Wert.Erledigt in
c990dbc.Divideemittiert nicht mehr(a / b), sonderndivide(a, b)— der Guard steht als Funktion imProlog neben
straight()(src/core/shader/nodes.ts:297):Null ist die Antwort, per Kanal bei Farben. Das war im Behavior- und im Partikel-Graphen schon
Hausregel — nur der Shader hatte sie nie bekommen. Damit ist auch
clamp(NaN)kein Thema mehr,weil gar kein NaN mehr entsteht.
Dazu, wie im Issue vorgeschlagen, ein
Clamp-Node im Shader-Katalog (value,min,max,per Kanal bei Farben); der Behavior-Katalog hatte ihn laengst.
Belegt:
npm run checkgruen (1090 Tests) und — das ist hier der eigentliche Beweis — einPixel-Check im e2e-Schritt 28 auf echter GPU:
Dividedurch 2 gibt#800000, durch 0 gibt#000000statt einer treiberabhaengigen Farbe. CI-Task 53 auf7e5003bgruen,ALL PASSED - 930 checks.