在Unity游戏开发中,滤镜是提升游戏画面质感和氛围的重要工具。通过巧妙运用滤镜,可以使得游戏画面更加生动、立体,给玩家带来沉浸式的游戏体验。以下将介绍十大实用的Unity滤镜技巧,帮助你轻松提升游戏画面效果。
1. 模糊滤镜(Blur Filter)
模糊滤镜是Unity中最常用的滤镜之一,它可以使游戏画面产生一种动态模糊的效果。以下是一个简单的模糊滤镜实现代码示例:
Shader "Custom/Blur"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 模糊滤镜实现
col += tex2D(_MainTex, i.uv + float2(0.01, 0.01)) * 0.5;
col += tex2D(_MainTex, i.uv - float2(0.01, 0.01)) * 0.5;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
2. 边缘检测滤镜(Edge Detection Filter)
边缘检测滤镜可以突出显示游戏画面中的边缘,使得物体更加立体。以下是一个简单的边缘检测滤镜实现代码示例:
Shader "Custom/EdgeDetection"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
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
{
float4 col = tex2D(_MainTex, i.uv);
float4 col1 = tex2D(_MainTex, i.uv + float2(0.01, 0.01));
float4 col2 = tex2D(_MainTex, i.uv - float2(0.01, 0.01));
// 边缘检测实现
float4 edge = abs(col - col1) + abs(col - col2);
return edge;
}
ENDCG
}
}
FallBack "Diffuse"
}
3. 色彩校正滤镜(Color Correction Filter)
色彩校正滤镜可以调整游戏画面的色彩,使其更加符合游戏风格。以下是一个简单的色彩校正滤镜实现代码示例:
Shader "Custom/ColorCorrection"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
float4 _Color;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 色彩校正实现
col = lerp(col, _Color, 0.5);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
4. 纹理置换滤镜(Texture Displacement Filter)
纹理置换滤镜可以改变物体表面的纹理,使其更加真实。以下是一个简单的纹理置换滤镜实现代码示例:
Shader "Custom/TextureDisplacement"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DisplacementMap ("Displacement Map", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
float3 worldPos : TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _DisplacementMap;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 col = tex2D(_MainTex, i.uv);
// 纹理置换实现
float displacement = tex2D(_DisplacementMap, i.uv).r;
float3 newWorldPos = i.worldPos + float3(displacement, 0, 0);
col = tex2D(_MainTex, newWorldPos);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
5. 高光滤镜(Highlight Filter)
高光滤镜可以使游戏画面中的物体产生高光效果,增强视觉冲击力。以下是一个简单的高光滤镜实现代码示例:
Shader "Custom/Highlight"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_HighlightColor ("Highlight Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
float4 _HighlightColor;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 高光实现
float4 highlight = _HighlightColor;
return lerp(col, highlight, 0.5);
}
ENDCG
}
}
FallBack "Diffuse"
}
6. 颜色反转滤镜(Color Inversion Filter)
颜色反转滤镜可以将游戏画面的颜色进行反转,产生一种特殊的视觉效果。以下是一个简单的颜色反转滤镜实现代码示例:
Shader "Custom/ColorInversion"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 颜色反转实现
col = 1 - col;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
7. 颜色饱和度滤镜(Color Saturation Filter)
颜色饱和度滤镜可以调整游戏画面的颜色饱和度,使其更加鲜艳或柔和。以下是一个简单的颜色饱和度滤镜实现代码示例:
Shader "Custom/ColorSaturation"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Saturation ("Saturation", Range(0, 1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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 _Saturation;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 颜色饱和度实现
col.rgb = pow(col.rgb, _Saturation);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
8. 色相调整滤镜(Hue Shift Filter)
色相调整滤镜可以调整游戏画面的色相,使其产生一种特殊的色彩效果。以下是一个简单的色相调整滤镜实现代码示例:
Shader "Custom/HueShift"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_HueShift ("Hue Shift", Range(-1, 1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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 _HueShift;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 色相调整实现
col.rgb = mod(col.rgb + _HueShift, 1);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
9. 暗角滤镜(Vignette Filter)
暗角滤镜可以使游戏画面的边缘产生暗角效果,突出画面中心。以下是一个简单的暗角滤镜实现代码示例:
Shader "Custom/Vignette"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_VignetteIntensity ("Vignette Intensity", Range(0, 1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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 _VignetteIntensity;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 暗角实现
float2 uv = (i.uv - 0.5) * 2;
float distance = length(uv);
col *= 1 - distance * _VignetteIntensity;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
10. 纹理扭曲滤镜(Texture Distortion Filter)
纹理扭曲滤镜可以扭曲游戏画面中的纹理,使其产生一种动态效果。以下是一个简单的纹理扭曲滤镜实现代码示例:
Shader "Custom/TextureDistortion"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DistortionAmount ("Distortion Amount", Range(0, 1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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 _DistortionAmount;
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
{
float4 col = tex2D(_MainTex, i.uv);
// 纹理扭曲实现
float2 distortedUV = i.uv + float2(_DistortionAmount, 0);
col = tex2D(_MainTex, distortedUV);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
通过以上十大实用滤镜技巧,相信你已经掌握了Unity游戏开发中常用的滤镜效果。在实际开发过程中,可以根据游戏需求灵活运用这些技巧,为玩家带来更加丰富的视觉体验。
