天天看點

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

在做遊戲過程中,多少都能聽到alpha blend,到底是如何混合呢,說是混合必然關系到兩個對象的混合,兩個對象是源顔色和目标顔色,混合公式是resultColor = srcColor * factor1 + desColor * factor2,那factor從何而來呢,例如指令Blend SrcAlpha OneMinusSrcAlpha,SrcAlpha是factor1,OneMinusSrcAlpha是factor2。

下面講解一個實際的應用,按鈕置灰

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

美術給的貼圖資源,除了看到部分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),如有不同請自行修改。

繼續閱讀