Jump to content
Unity Insider Forum

Shader und meine persönlichen Grenzen


Haegar

Recommended Posts

Hallo *,

 

 

für mein neuen Spiel benötige ich ein Material, dessen MainTexture sich dreht. Ich verwende das Material LegacyShaders/Decal.

 

Die Textur-Rotation versuche ich mit:

 

 float rotateSpeed = 30f;
 Quaternion rot = Quaternion.Euler (0, 0, Time.time * rotateSpeed);
 Matrix4x4 m = Matrix4x4.TRS (Vector3.zero, rot, Vector3.one);
 GetComponent<Renderer>().material.SetMatrix ("_TextureRotation", m);
 

 

Unter https://docs.unity3d....SetMatrix.html habe ich gelesen, dass man den Shader um die Funktion der Texturrotation erweitern muss. Der benötigte Sourcecode ist auch fein säuberlich aufgelistet, aber ich krieg ihn nicht korrekt eingebunden.

 

Der zweite Schritt vor dem ersten: Wenn ich dann mal den Shader editiert habe, wie kriege ich ihn dann in mein Projekt eingebunden? Ich habe versucht, den unveränderten unter einem neuen Namen abzuspeichern, aber er erscheint nicht in der Auswahl.

 

Also zwei persönliche Grenzen überschritten...

 

Danke für Tipps,

Ulrich

 

... achja, ich hab mir Shader Forge gekauft - bisher ohne Erfolg.Über eine Lösung meines Problems hiermit würde ich mich auch freuen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mich mal hingesetzt und einen Shader zusammengeschraubt. Gedreht wird die Decaltextur (also die Maintextur weglassen, wenn man sie nicht braucht):

 

Shader "Legacy Shaders/DecalRotate" {

// Created for Unity Insider Forum by zer0f0rce 2017
Properties{
_Color("Main Color", Color) = (1,1,1,1)
_MainTex("Base (RGB)", 2D) = "white" {}
  _DecalTex("Decal (RGBA)", 2D) = "black" {}
_Speed("Speed", Range(0,50)) = 1.0
}

SubShader{
Tags{ "RenderType" = "Opaque" }
LOD 250

CGPROGRAM
   #pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _DecalTex;
fixed4 _Color;
float _Speed;

struct Input {
float2 uv_MainTex;
float2 uv_DecalTex;
};

void surf(Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);

float sin_factor = sin(_Time.y/ (1.0f/_Speed));
float cos_factor = cos(_Time.y/ (1.0f/_Speed));
fixed2 inuv = IN.uv_DecalTex;
inuv = mul((inuv - 0.5), float2x2(cos_factor, sin_factor, -sin_factor, cos_factor));
half4 decal = tex2D(_DecalTex, inuv);

c.rgb = lerp(c.rgb, decal.rgb, decal.a);
c *= _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}

Fallback "Legacy Shaders/Diffuse"
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soll sich nur die Maintextur drehen, dann verwende diesen Shader hier:

Shader "Legacy Shaders/DecalRotateMaintex" {

// Created for Unity Insider Forum by zer0f0rce 2017
Properties{
 _Color("Main Color", Color) = (1,1,1,1)
 _MainTex("Base (RGB)", 2D) = "white" {}
 _DecalTex("Decal (RGBA)", 2D) = "black" {}
 _Speed("Speed", Range(0,50)) = 1.0
}
SubShader{
Tags{ "RenderType" = "Opaque" }
LOD 250
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _DecalTex;
fixed4 _Color;
float _Speed;
struct Input {
 float2 uv_MainTex;
 float2 uv_DecalTex;
};
void surf(Input IN, inout SurfaceOutput o) {
 fixed2 inuv = IN.uv_DecalTex;
 float sin_factor = sin(_Time.y / (1.0f / _Speed));
 float cos_factor = cos(_Time.y / (1.0f / _Speed));
 inuv = mul((inuv - 0.5), float2x2(cos_factor, sin_factor, -sin_factor, cos_factor));
 fixed4 c = tex2D(_MainTex, inuv);

 half4 decal = tex2D(_DecalTex, IN.uv_DecalTex);
 c.rgb = lerp(c.rgb, decal.rgb, decal.a);
 c *= _Color;
 o.Albedo = c.rgb;
 o.Alpha = c.a;
}
ENDCG
}
 Fallback "Legacy Shaders/Diffuse"
}

 

PS:

Beide Skripte als *.shader speichern und im Projektverzeichnis ablegen.

Die Shader benötigen keinerlei zusätzliche Skripte mehr, einfach Material erstellen und unter "Legacy/Shader" einen der beiden gewünschten Shader auswählen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank Zer0cool für die Mühe, die Du Dir gemacht hast.

 

Ich habe die Shader compiliert und sie funktionieren absolut problemlos.

 

In den nächsten tagen werde ich mich mal etwas intensiver mit den Shadern beschäftigen, da ich zum einen die Funktion verstehen und zum anderen auch noch ein paar Feinheiten einbauen möchte.

 

Nochmals Danke,

Ulrich

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gern geschehen, ich habe sie bewusst einfach gehalten. Über den genauen mathematischen Background dieser Matrizenmultiplikation darfst du mich allerdings nicht fragen, die habe ich einer anderen Quelle entnommen. Ich verstehe nur, daß über diese Multiplikation die uv's auf den Mittelpunkt zentriert und anhand der Kreisposition (u=sin(winkel) ; v = cos(winkel) ) rotiert werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...