圖形學應用_着色器實例—馬賽克效果

馬賽克效果的實現

最終效果:

將材質付給物體:

左側是表面着色器,右側是頂點和片元着色器。

將材質球用來處理屏幕特效: 

上圖是頂點和片元着色器來處理屏幕特效的效果。表面着色器不能用來處理屏幕特效。(不知道爲什麼,只顯示一片黑)。

表面着色器代碼:

Shader "Custom/Mosaic_SurfaceShader" {
	Properties{
		_MainTex("Albedo (RGB)", 2D) = "white" {}
	    _Size("Scale",int) = 1
	}
		SubShader{
			Tags { "RenderType" = "Opaque" "Queue"="Transparent"}
			CGPROGRAM
			#pragma surface surf Lambert alpha
			sampler2D _MainTex;
		    half4 _MainTex_TexelSize;
			half _Size;
			struct Input
			{
				float2 uv_MainTex;
			};
			void surf(Input IN,inout SurfaceOutput o)
			{
				fixed2 u = floor(IN.uv_MainTex*_MainTex_TexelSize.zw / _Size)*_Size;
				u = u * _MainTex_TexelSize.xy;
				o.Albedo = tex2D(_MainTex, u);
				o.Alpha = 1;
			}
			ENDCG
	} 
			FallBack "Diffuse"
}

 

頂點和片元着色器代碼:

Shader "Custom/Mosaic_VFShader" {
	Properties{
		_MainTex("Albedo (RGB)", 2D) = "white" {}
	    _Size("Scale",int) = 1
	}
		SubShader{
			Tags { "RenderType" = "Opaque" "Queue" = "Transparent"}
			Pass
		   {
			Blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

#include "UnityCG.cginc"

			sampler2D _MainTex;
			half _Size;
			half4 _MainTex_TexelSize;
			struct appdata
			{
				float2 uv:TEXCOORD0;
				float4 vertex:POSITION;
			};
			struct v2f
			{
				float2 uv:TEXCOORD0;
				float4 vertex:POSITION;
			};
			v2f vert(appdata IN)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(IN.vertex);
				o.uv = IN.uv;
				return o;
			}
			fixed4 frag(v2f i) :SV_Target
			{
				fixed4 o;
			    fixed2 u = floor(i.uv*_MainTex_TexelSize.zw/_Size)*_Size;
				u = u * _MainTex_TexelSize.xy;
				o.rgb = tex2D(_MainTex,u);
				return o;
			}
			ENDCG
	} }
}

 注意:

_MainTex_TexelSize是 unity 內置的變量,它的值爲 Vector4(1 / width, 1 / height, width, height),存儲着主貼圖的信息。

根據不同的算法,馬賽克效果是不同的,這裏是正方形馬賽克,還有圓形馬賽克,蜂窩形馬賽克,根據算法可以實現不同的效果。

希望可以幫到想要學習着色器的讀者。如果有誰知道爲什麼表面着色器處理屏幕特效會是一片黑,希望能告訴我一下。謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章