Ich will eine animierte "Schleimspur" erzeugen. Sie soll animiert sein, weil der Spieler davon beeinflusst wird, nicht wie bei den anderen Splattereffekten.
Mein erster Gedanke war eine Tilemap zu erzeugen. Die gefährlichen Bereiche werden sowieso in einem Grid gespeichert, das einfach abgefragt werden kann.
Ich hatte fast alle Tiles gezeichnet und war mit dem Code fortgeschritten, es sah leider nicht gut aus. Das Grid-basierte ist zu offensichtlich und passt nicht...
Die neue Lösung war am Anfang einfacher, benötigte aber einen Framebuffer. Anstatt die Tiles korrekt zu platzieren, habe ich mit etwas Zufall flecken verteilt. Es sieht so in etwa aus wie ich es mir vorgestellt habe.
Ein Problem hatte ich nicht bedacht. Die Spur sollte nach einer Zeit wieder weg, gleichzeitig wie der Schaden aus dem Grid entfernt wird. Nur wie kann ich das Lösen?
Erster Ansatz war drüberzeichnen. Das habe ich dann nicht umgesetzt, weil es mir recht klar war dass es bei Überschneidungen Probleme geben wird.
Zweiter Ansatz war den Auflösungszeitpunkt der Spur im Framebuffer zu speichern. Sah super aus, ich war happy.
Leider ging es aber nicht ewig gut, nach ziemlch genau 90 Sekunden war aus mit der Spur. Vermutlich eine Präzisionsgeschichte, genau weiss ich es nicht.
Damit schlage ich mich jetzt seit Stunden rum und werde nicht schlauer. Es macht keinen Unterschied ob ich mit 10er oder 100er schritten die Zeit aufteile, es hört immer zum selben Zeitpunkt auf zu funktionieren.
Ich vergleiche die aktuelle Zeit mir der End-Zeit aus em Framebuffer und irgendwie ist nach 90s der End-Zeit wert immer kleiner. Evtl. was einfaches, aber ich sehe es heute nicht (ich bin leicht krank, evtl. liegt es daran)
Code: Alles auswählen
//speichern des floats (schreibe in frame buffer)
float endTime = u_time + v_mode;
float r = fract(endTime);
endTime = floor(endTime)*0.01;
float g = fract(endTime);
endTime = floor(endTime)*0.01;
float b = fract(endTime);
gl_FragColor = vec4(r,g,b,1.0);
//laden des floats aus framebuffer
float endTime = c.r + c.g*100.0 + c.b*10000.0;// + c.a*1000000.0;
float alpha = min(1.0, (endTime-u_time)*0.2);
Für den Showroom :lol:
edit: .... hm, Ich habe statt *0.01 mit /256.0 gerechnet und bin schon bei 200 sekunden ohne Fehler... ich hab mir die Rundungsfehler selber eingebrockt.