Ich versuche, diesen Shader auf einem wirklich alten iDevice sowie schließlich auf Androids zum Laufen zu bringen.
Selbst wenn ich den Code auf 2 Sinusfunktionen pro Fragment reduziere, läuft der Shader mit etwa 20 fps.
Ich habe darüber nachgedacht, ein Blatt aus dem Buch der alten Schattierungstechniken herauszunehmen und ein Array zu erstellen, das eine Reihe vordefinierter Triggerwerte enthält, und diese irgendwie zu verwenden, um den Shader zu approximieren.
In dem oben verlinkten Shader simuliere ich bereits, dass durch Runden der an die Triggerfunktion gesendeten Werte die Qualität des Shaders umso geringer ist, je weiter links die Maus (während der Abwärtsbewegung) ist. Es ist eigentlich ziemlich cool, weil es ganz in der Nähe der linken Seite wie ein völlig anderer und ziemlich cooler Shader aussieht.
Jedenfalls habe ich zwei Dilemmata:
- Ich weiß nicht, wie ich ein Array mit 360 Werten in einem GLSL-Shader, der konstant oder einheitlich ist, am effizientesten speichern kann.
Ich kann nicht herausfinden, wie man eine Zahl in einen Bereich wie gewöhnlich einfügt, wenn ich einen Winkel zwischen 0 und 360 haben möchte (ja, ich weiß, dass GPUs Bogenmaß verwenden). Ich würde es so machen.
func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; }
GLSL erlaubt jedoch keine while-Schleifen oder rekursiven Funktionen.
mod
Funktion genau das, was Sie wollen. Du würdest schreiben mod(angle, 360.0)
.