Ich habe eine Rocket League gesehen und festgestellt, dass es animierte Abziehbilder und Räder gibt.
.
Ich möchte etwas Ähnliches wie die Effekte im obigen Bild implementieren.
Wie würde ich einen Unity Shader schreiben, um den Radeffekt zu erzielen?
Ich weiß nicht viel über Shader, aber kann ich den Standard-Unity-Shader bearbeiten, um den Animationseffekt auszuführen?
_Time
Variable, die Sie Ihren Texturkoordinaten im (Scheitelpunkt-) Shader hinzufügen können, um einen spottbilligen Bildlaufeffekt zu erzielen. Der Sechseckeffekt wäre auch ziemlich einfach. Wenn Sie Ihre Frage bearbeiten, um nur einen Effekt hervorzuheben, und fragen: "Wie würde ich dies in einem Unity-Shader implementieren?", Können wir Ihnen wahrscheinlich helfen. Stellen Sie sicher, dass Sie angeben, ob der Shader auf Beleuchtung / Schatten reagieren muss, da dies Auswirkungen auf die Schreibweise hat.Antworten:
Ich werde dies in ein paar Schichten aufbauen, damit Sie sehen können, wie es zusammenkommt.
Beginnen Sie mit dem Erstellen eines neuen Shaders in Unity, indem Sie
Create --> Shader --> Unlit
entweder das Menü "Assets" oder das Kontextmenü mit der rechten Maustaste im Projektfenster auswählen .Im oberen Block fügen wir einen
_ScrollSpeeds
Parameter hinzu, um zu steuern, wie schnell sich die Textur in jede Richtung bewegt:Dadurch wird eine neue 4-Komponenten-Float-Eigenschaft im Materialinspektor mit dem Anzeigenamen "Bildlaufgeschwindigkeiten" verfügbar gemacht (ähnlich wie beim Hinzufügen einer
public
oder einerSerialized
Variablen zu einemMonoBehaviour
Skript).Als Nächstes verwenden wir diese Variable im Vertex-Shader, um die Texturkoordinaten (
o.uv
) zu verschieben, indem wir dem Standard-Shader nur zwei Zeilen hinzufügen:Schlagen Sie das auf ein Quad (mit einer schönen freien Giraffentextur von Kenney ) und Sie erhalten:
Um die Textur in einem Ring nach außen zu scrollen, könnten wir einfach ein Netz verwenden, das wie ein Spinnennetz unterteilt ist, wobei die UV-V-Koordinate von der Mitte nach außen zunimmt. Aber das wird einige sägeblattförmige Artefakte für sich ergeben. Stattdessen werde ich zeigen, wie wir unsere UVs pro Fragment berechnen können.
Dies ist etwas kostspieliger, sowohl aufgrund der Trigger- und Längenoperationen (die teurer sind als die grundlegende Mathematik) als auch, weil es nicht so effizient ist, Texturdaten in der Hardware vorherzusagen und zwischenzuspeichern, wenn Texcoords pro Fragment berechnet werden, als sie nur zu interpolieren zwischen Eckpunkten. Aber für einen kleinen Spezialeffekt wie diesen ist es nicht übertrieben.
Das gibt uns ungefähr so etwas (hier habe ich die Kachelparameter im Material erhöht, damit klarer wird, was passiert - nur eine einzige Wiederholung der Kachel um den Kreis zu wickeln sieht verzerrt und seltsam aus)
Um die Textur durch einen Bildlaufverlauf zu tönen, können wir den Verlauf einfach als zweite Textur hinzufügen und miteinander multiplizieren.
Zuerst fügen wir den neuen Texturparameter oben hinzu:
Und deklarieren Sie es in unserem CGPROGRAM-Block, damit der CG-Shader es sehen kann:
Aktualisieren Sie dann unseren Fragment-Shader, um beide Texturen zu verwenden:
Und jetzt wird unsere Giraffe richtig trippig:
Mit einer etwas künstlerischeren Auswahl von Texturen und Bildlaufraten kann dies einen Effekt erzeugen, der dem in der Frage gezeigten sehr ähnlich ist.
Möglicherweise stellen Sie bei der oben gezeigten Version zwei kleine Artefakte fest:
Die Gesichter in der Nähe des Kreismittelpunkts werden gestreckt / dünn / spitz, und wenn sie sich nach außen bewegen, werden sie gequetscht / breit.
Diese Verzerrung tritt auf, weil wir eine feste Anzahl von Flächen um den Umfang haben, aber der Umfang, den sie überspannen, wird größer, wenn der Radius zunimmt, während ihre Höhe gleich bleibt.
Wir können dies beheben, indem wir die vertikale Komponente der Texturprobe neu zuordnen, um einer logarithmischen Kurve zu folgen, sodass Wiederholungen der Textur mit zunehmendem Radius weiter auseinander liegen und näher an der Mitte liegen. (Tatsächlich gibt uns dies einen unendlichen Rückschritt von immer kleineren Giraffen ...)
Es gibt eine Reihe von ein oder zwei verschwommenen Pixeln in der Mitte links des Quad.
Dies liegt daran, dass die GPU zwei benachbarte Texturbeispielkoordinaten betrachtet, um herauszufinden, welche Filterung verwendet werden soll. Wenn die Samples nahe beieinander liegen, wird die Textur groß / nah angezeigt und der detaillierteste Mip-Level angezeigt. Wenn die Samples weit voneinander entfernt sind, müssen wir die Textur vermutlich mit einem winzigen Zoom oder weit entfernt anzeigen und sie werden von einer kleineren / unschärferen Mipmap abgetastet, um sicherzustellen, dass wir keine funkelnden Aliasing-Artefakte erhalten.
Das Problem ist hier, wir sind am Umlaufpunkt in Polarkoordinaten von -180 bis 180 Grad. Wir probieren also tatsächlich von sehr ähnlichen Punkten in unserem sich wiederholenden Texturraum aus, selbst wenn ihre numerischen Koordinaten sie so aussehen lassen, als wären sie weit voneinander entfernt. Daher können wir unsere eigenen Abtastgradientenvektoren bereitstellen, um dies zu korrigieren.
Hier ist eine Version mit diesen Korrekturen:
quelle
tex2Dgrad
Texturverläufe und korrigieren Sie das Filterartefakt, bei dem sich der Winkel von -pi nach + pi dreht (das ist die dünne Linie unscharfer Pixel auf der linken Seite). Hier ist das