渲染时Alpha是如何混合的?(附有UI灰色效果的shader)

在做游戏过程中,多少都能听到alpha blend,到底是如何混合呢,说是混合必然关系到两个对象的混合,两个对象是源颜色和目标颜色,混合公式是resultColor = srcColor * factor1 + desColor * factor2,那factor从何而来呢,例如命令Blend SrcAlpha OneMinusSrcAlpha,SrcAlpha是factor1,OneMinusSrcAlpha是factor2。

下面讲解一个实际的应用,按钮置灰

美术给的贴图资源,除了看到部分alpha值是1,其余部分alpha值是0,当alpha混合的时候,我们使用命令Blend SrcAlpha OneMinusSrcAlpha,通过混合公式计算出混合颜色,透明部分就会显示目标颜色,非透明部分就会显示源颜色。

Shader "UI/Gray"
{
	Properties
	{
		[PerRendererData]_MainTex("Sprite Texture", 2D) = "white" {}
	}
	SubShader
	{
		Tags {
			"Queue" = "Transparent"
			"RenderType" = "Transparent"
		}

		Blend SrcAlpha OneMinusSrcAlpha
		ZWrite Off

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

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				float gray = (col.r + col.g + col.b) / 3;
				col.rgb = float3(gray, gray, gray);
				return col;
			}
			ENDCG
		}
	}
}

此shader是运行在Unity(UGUI),如有不同请自行修改。

你可能感兴趣的:(Unity游戏开发)