shader马赛克效果实现

原理
         图片像素化实际上与马赛克的生成一样,我们可以通过对图形UV值进行放大,然后截取整数部分,在缩放回原来大小,此时图片UV的精度丢失了,形成了马赛克的效果。

例如:

        两个点P1(0.1,0),P2(0.12,0),先同时放大10倍获得,点为P1'(1.0,0),P2'(1.2,0),此时我们只取点的整数部分得到P1''(1,0),P2(1,0),最后再缩放回原来的大小那么P1,P2所对应的点都为(0.1,0)。

 


Shader "Unlit/PixelationShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_PixelSize ("Pixel Size", Range(1,256)) = 64
	}
	SubShader
	{
		Tags { "Queue"="Transparent" }
		Blend SrcAlpha OneMinusSrcAlpha
 
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
 
			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};
 
			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};
 
			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _PixelSize;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col;
 
				float ratioX = (int)(i.uv.x * _PixelSize) / _PixelSize;
				float ratioY = (int)(i.uv.y * _PixelSize) / _PixelSize;
 
				col = tex2D(_MainTex, float2(ratioX, ratioY));
 
				if(col.a<0.5)
				{
					col.a=0;
				}
 
				return col;
			}
			ENDCG
		}
	}

}

你可能感兴趣的:(shader)