Jump to content
Unity Insider Forum
Sign in to follow this  
Haegar

Shader und meine persönlichen Grenzen

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...

Share this post


Link to post
Share on other sites

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"
}

  • Like 1

Share this post


Link to post
Share on other sites

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.

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...