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

Sprite Shader- Color Tint

Recommended Posts

Moin moin,

Ich brauche einen Shader für Sprites, welcher Schatten erzeugen und "empfangen" kann. Nach ein wenig Internet-Recherche habe ich einen Shader gefunden, der genau das macht- Allerdings kann ich mit diesem Shader nicht mehr die Sprites einfärben (siehe Bild).Beispiel.thumb.png.a01caae5299953f7c179e803f4eb067d.png

 

Könnte mir jemand den folgenden Shader-Code so anpassen, dass das mit der Farbe funktioniert?

Shader "Sprites/Beat/Diffuse-Shadow"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.5
    }
 
    SubShader
    {
        Tags
        {
            "Queue"="AlphaTest"
            "IgnoreProjector"="True"
            "RenderType"="TransparentCutout"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }
 
        LOD 200
        Cull Off
        Lighting On
        ZWrite Off
 
        CGPROGRAM
        #pragma surface surf Lambert addshadow alphatest:_Cutoff
 
        sampler2D _MainTex;
        fixed4 _Color;
 
        struct Input
        {
            float2 uv_MainTex;
        };
 
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
 
    Fallback "Legacy Shaders/Transparent/Cutout/VertexLit"
}

 

PS: Ich habe mich versucht, in das Thema Shader reinzuarbeiten, konnte bisher aber noch bei keinem Tutorial den Code nachvollziehen. :wacko:

Share this post


Link to post
Share on other sites

So, nun hab ich aber was gut :)

Hier der Shader (ich habe noch ein paar Zeilen aus dem Original Sprite Shader eingefügt für's PixelSnap und Flipping):

Shader "Sprites/Beat/Diffuse-Shadow"
{
	Properties
	{
		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
	    _Color("Tint", Color) = (1,1,1,1)
		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
		[HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
		[HideInInspector] _Flip("Flip", Vector) = (1,1,1,1)
		_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
	}

		SubShader
	{
		Tags
	{
		"Queue" = "AlphaTest"
		"IgnoreProjector" = "True"
		"RenderType" = "TransparentCutout"
		"PreviewType" = "Plane"
		"CanUseSpriteAtlas" = "True"
	}

		LOD 200
		Cull Off
		Lighting On
		ZWrite Off

		CGPROGRAM
#pragma surface surf Lambert vertex:vert addshadow alphatest:_Cutoff
#pragma multi_compile _ PIXELSNAP_ON
#include "UnitySprites.cginc"

	struct Input
	{
		float2 uv_MainTex;
		fixed4 color;
	};

		void vert(inout appdata_full v, out Input o)
		{
			v.vertex.xy *= _Flip.xy;

#if defined(PIXELSNAP_ON)
			v.vertex = UnityPixelSnap(v.vertex);
#endif 

			UNITY_INITIALIZE_OUTPUT(Input, o);
			o.color = v.color * _Color * _RendererColor;
		}

	void surf(Input IN, inout SurfaceOutput o)
	{
		fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
		o.Albedo = c.rgb;
		o.Alpha = c.a;
	}
	ENDCG
	}

		Fallback "Legacy Shaders/Transparent/Cutout/VertexLit"
}


Dieses Skript ist auch noch notwendig, damit der Sprite Renderer auch Schatten weiterleitet:

using UnityEngine;
using UnityEngine.Rendering;

public class ControlSpriteRenderer : MonoBehaviour {

    private Renderer render;

	// Use this for initialization
	void Start () {
        render = GetComponent<Renderer>();
        render.receiveShadows = true;
        render.shadowCastingMode = ShadowCastingMode.On;
    }
	
}

Der Schattenwurf scheint aber nur für's Directional-Light zu funktionieren. Bei einem Spot-Light scheinen keine Schatten zu entstehen ...

  • Like 1

Share this post


Link to post
Share on other sites

Heyyo!

Danke nochmal herzlich fürs Umschreiben Zer0Cool. Wir profitieren sehr von dem Feature. 🙇‍♂️

Jetzt ist mir allerdings vor kurzem etwas Sonderbares mit diesem Shader aufgefallen und vielleicht weiß jemand eine Antwort.
Zusätzlich zur Priorität von Sprites versuchen wir diese mit dem Z-Wert zu Sortieren. Bedeutet; wenn mal ein Sprite dieselbe Prio hat (lässt sich in unserem Fall nicht vermeiden) wird anhand des Z-Wert entschieden welcher Sprite davor/dahinter liegt.

Funktioniert ohne Schader auch tadellos und da ist auch schon das Problem.
Dieses Sortier-System funktioniert mit dem Shader nur stellenweise. Nach zahlreichen Testversuchen sieht es so aus, als würde der Shader seine Anzeigepriorität in Abschnitte unterteilen.
Wann immer ein Sprite einen dieser Abschnitte im Z-Wert verlässt, legt es sich über alle anderen die eigentlich davor liegen sollten. Die Abschnittsgrenzen liegen bei Z=2,8,32,128,...
Alle Sortierungen innerhalb eines Abschnittes funktionieren einwandfrei. Wir können also einfach in diesen Safe-Zones unser Spiel bauen, trotzdem wundert es uns, wodurch so etwas zu Stande kommt. (Project Settings/Graphics/Sort Mod = Custom Axes x0, y0, z-1)

grenzen.png

abschnitte.png

abschnitte2.png

abschnitte3.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×