Jump to content
Unity Insider Forum
GaRv3

Semitransparente Sprite Renderer gegenseitig maskieren?

Recommended Posts

Hallo zusammen,

ich arbeite gerade an einem Hex-basierten Game und möchte einen halbtransparenten Layer über einige Tiles legen.
Im Grunde sind es einfach nur Sprites, die über einige Tiles gelegt werden.

Allerdings gibt es je nach Zoomstufe Probleme mit den Kanten, an denen die Sprites sich berühren. Entweder bleiben einzelne Pixel frei oder die Sprites überlappen sich.
Letzteres wäre für mich okay, wenn die Sprites sich nicht aufgrund ihrer Transparenz addieren würden.

Daher meine Frage:
Kann ich die Sprite Renderer irgendwie so konfigurieren, dass sie sich gegenseitig maskieren, also nicht übereinander dargestellt werden können?
Sie liegen auf unterschiedlichen Objekten, haben aber alle identische Sorting Layer und Order in Layer.

 

Vielen Dank und besten Gruß
GaRv3

Share this post


Link to post
Share on other sites

Klingt nach einem Fall für einen Sprite Shader, der den Stencil Buffer benutzt.

Share this post


Link to post
Share on other sites

Oha! Hab befürchtet dass es auf Shader hinausläuft.

Hast du zufällig ein verständliches Tutorial parat?

Share this post


Link to post
Share on other sites

Okay, hab den Shader umgeschrieben und er unterstützt jetzt auch Tint Color und Transparenz.

Vielen Dank für den Link!

Für alle, die es interessiert, hier der Shader:

Shader "Sprites/Fog of War"
{
	Properties{
		_MainTex("Base (RGB)", 2D) = "white" {}
		_Color("Tint", Color) = (1,1,1,1)
	}

	SubShader{
		Tags { "Queue" = "Transparent" }

		Pass {
			Stencil {
				Ref 2
				Comp NotEqual
				Pass Replace
			}

			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			uniform sampler2D _MainTex;

			struct appdata_t
			{
				float4 vertex   : POSITION;
				float4 color    : COLOR;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				half4 pos : POSITION;
				fixed4 color : COLOR;
				half2 uv : TEXCOORD0;
			};

			fixed4 _Color;

			v2f vert(appdata_t v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.color = v.color * _Color;
				half2 uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord);
				o.uv = uv;
				return o;
			}

			half4 frag(v2f i) : COLOR{
				half4 color = tex2D(_MainTex, i.uv) * i.color;
				if (color.a < 0.3)
					discard;
				color.rgb *= color.a;
				return color;
			}
				
			ENDCG
		}

	}

	Fallback off
}

 

  • Like 1

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

×
×
  • Create New...