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.
quelle
mod
Funktion genau das, was Sie wollen. Du würdest schreibenmod(angle, 360.0)
.Antworten:
GL_REPEAT
Umbruchmodus für die Textur und sie beginnt automatisch wieder am Anfang, wenn Sie mit Argumenten> 1 (und ähnlich für negative Argumente) zugreifen.GL_LINEAR
als Texturfilter verwenden. Auf diese Weise erhalten Sie Werte, die Sie nicht einmal gespeichert haben. Natürlich ist die lineare Interpolation für trigonometrische Funktionen nicht 100% genau, aber sie ist sicherlich besser als keine Interpolation.float sin = 2.0 * (texValue.r + texValue.g / 256.0) - 1.0;
(oder noch mehr Komponenten für feineres Korn). So können Sie wieder von Mehrkomponenten-Texturen profitieren.Natürlich muss noch geprüft werden, ob dies eine bessere Lösung ist, da der Texturzugriff auch nicht ganz kostenlos ist und die beste Kombination aus Texturgröße und Format vorliegt.
Um die Textur mit Daten zu füllen und einen Ihrer Kommentare zu adressieren, müssen Sie berücksichtigen, dass die Texturfilterung den genauen Wert in der Texelmitte zurückgibt , dh eine Texturkoordinate, die um die Hälfte der Texelgröße abweicht . Also ja, Sie sollten Werte bei
.5
Texels generieren , dh so etwas im Anwendungscode:uniform float sinTable[361]
glUniform1fv
mod
quelle