shader 2D图片过渡

本文介绍了一种用于游戏开发中背景图片过渡替换的Shader技术。该Shader通过使用多个纹理资源和透明通道效果来实现平滑的过渡效果。此外,还支持像素描边效果,并提供了控制描边颜色的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏中背景图片过渡替换,通过透明通道过渡
Shader "2DSprites/transit"
{
	Properties
	{
		_MainTex("Sprite Texture", 2D) = "white" {}
		_MainTex2("Tex2 (RGB)", 2D) = "white" {}
		_MainTex3("Tex3 (RGB)", 2D) = "white" {}
		_Color("Tint", Color) = (1,1,1,1)
		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
		_Glossiness("Smoothness", Range(0,1)) = 0.5
		// Add values to determine if outlining is enabled and outline color.
		[PerRendererData] _Outline("Outline", Float) = 0
		[PerRendererData] _OutlineColor("Outline Color", Color) = (1,1,1,1)
	}

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

		Cull Off
		Lighting Off
		ZWrite Off
		Blend One OneMinusSrcAlpha

		Pass
	{
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ PIXELSNAP_ON
#pragma shader_feature ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc"

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

	struct v2f
	{
		float4 vertex   : SV_POSITION;
		fixed4 color : COLOR;
		float2 texcoord  : TEXCOORD0;
	};

	fixed4 _Color;
	float _Outline;
	float PixelSnap;
	float _Glossiness;
	fixed4 _OutlineColor;

	v2f vert(appdata_t IN)
	{
		v2f OUT;
		OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
		OUT.texcoord = IN.texcoord;
		OUT.color = IN.color * _Color;
#ifdef PIXELSNAP_ON
		OUT.vertex = UnityPixelSnap(OUT.vertex);
#endif

		return OUT;
	}

	sampler2D _MainTex;
	sampler2D _MainTex2;
	sampler2D _MainTex3;
	sampler2D _AlphaTex;
	float4 _MainTex_TexelSize;

	fixed4 SampleSpriteTexture(float2 uv)
	{
		fixed4 color = tex2D(_MainTex, uv);
		fixed4 color2 = tex2D(_MainTex2, uv);
		fixed4 color3 = tex2D(_MainTex3, uv);

#if ETC1_EXTERNAL_ALPHA
		// get the color from an external texture (usecase: Alpha support for ETC1 on android)
		//color.a = tex2D(_AlphaTex, uv).r;
#endif //ETC1_EXTERNAL_ALPHA
		if (_Glossiness > color3.a)
		{
			return color;
		}
		return color2;
	}

	fixed4 frag(v2f IN) : SV_Target
	{
		fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;

	// If outline is enabled and there is a pixel, try to draw an outline.
	if (PixelSnap > 0 && c.a != 0) {
		// Get the neighbouring four pixels.
		fixed4 pixelUp = tex2D(_MainTex, IN.texcoord + fixed2(_Outline, _MainTex_TexelSize.y));
		fixed4 pixelDown = tex2D(_MainTex, IN.texcoord - fixed2(_Outline, _MainTex_TexelSize.y));
		fixed4 pixelRight = tex2D(_MainTex, IN.texcoord + fixed2(_MainTex_TexelSize.x, _Outline));
		fixed4 pixelLeft = tex2D(_MainTex, IN.texcoord - fixed2(_MainTex_TexelSize.x, _Outline));

		// If one of the neighbouring pixels is invisible, we render an outline.
		if (pixelUp.a * pixelDown.a * pixelRight.a * pixelLeft.a == 0) {
			c.rgba = fixed4(1, 1, 1, 1) * _OutlineColor;
		}
	}

	c.rgb *= c.a;

	return c;
	}
		ENDCG
	}
	}
}

### RectMask2D 软化效果的着色器实现 在Unity中,`RectMask2D`组件用于裁剪子对象超出其矩形范围的部分。为了实现软化的边缘效果,可以编写自定义Shader来处理这种渐变过渡。 #### 实现思路 通过修改顶点位置或颜色透明度,在矩形边界处创建平滑过渡区域。通常做法是在片段着色器阶段计算像素距离矩形边界的远近程度,并据此调整Alpha通道值[^1]。 #### Shader代码示例 下面是一个简单的基于表面着色器(Surface Shader)的例子: ```csharp Shader "Custom/SoftRectMask" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _FeatherDistance("Feather Distance", Range(0, 0.1)) = 0.05 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; float2 worldPos : TEXCOORD1; // Store screen position for masking. }; sampler2D _MainTex; float4 _MainTex_ST; float _FeatherDistance; v2f vert(appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); // Calculate object's position in world space. o.worldPos.xy = mul(unity_ObjectToWorld, v.vertex).xy; return o; } fixed4 frag(v2f i) : COLOR { half4 col = tex2D(_MainTex, i.uv); // Get mask bounds from C# script attached to GameObject with this material. float2 minBounds = unity_WorldToObject._m03_m13 - (_ScreenParams.xy * _FeatherDistance); float2 maxBounds = unity_WorldToObject._m03_m13 + (_ScreenParams.xy * _FeatherDistance); // Compute distance factor based on how close pixel is to border. float distFactor = smoothstep(minBounds.x, maxBounds.x, i.worldPos.x) * smoothstep(maxBounds.y, minBounds.y, i.worldPos.y) * smoothstep(minBounds.y, maxBounds.y, i.worldPos.y) * smoothstep(maxBounds.x, minBounds.x, i.worldPos.x); // Apply feathering effect by modifying alpha channel according to distance. col.a *= lerp(col.a, 0, saturate((distFactor - 0.5)/_FeatherDistance)); return col; } ENDCG } } } ``` 此着色器接受两个参数:纹理贴图(`_MainTex`)以及羽化宽度(`_FeatherDistance`)。它会根据当前渲染物体的世界坐标判断哪些部分应该被遮挡并应用不同程度的半透明效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值