Antragon Geschrieben 17. April 2018 Melden Share Geschrieben 17. April 2018 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). 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. Mai 2018 Melden Share Geschrieben 26. Mai 2018 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 ... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Polywonk Geschrieben 24. Januar 2019 Melden Share Geschrieben 24. Januar 2019 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) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.