馬賽克效果的實現
最終效果:
將材質付給物體:
左側是表面着色器,右側是頂點和片元着色器。
將材質球用來處理屏幕特效:
上圖是頂點和片元着色器來處理屏幕特效的效果。表面着色器不能用來處理屏幕特效。(不知道爲什麼,只顯示一片黑)。
表面着色器代碼:
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),存儲着主貼圖的信息。
根據不同的算法,馬賽克效果是不同的,這裏是正方形馬賽克,還有圓形馬賽克,蜂窩形馬賽克,根據算法可以實現不同的效果。
希望可以幫到想要學習着色器的讀者。如果有誰知道爲什麼表面着色器處理屏幕特效會是一片黑,希望能告訴我一下。謝謝