上次写完那坨固态水之后,就想试着写一个比较节省性能比较省的一片水试试,然鹅,天有不测风云,人有旦夕祸福,我不幸地沉迷于空洞骑士,每天都沉迷于打boss与跑尸乐此不疲……
我自己都觉得好悔恨,好罪恶,怎么能天天打游戏呢,所以今天先把这个简单的后处理色散效果写了,简单水那个也快写好了,真的快写好了……
色散是太阳光沿着一定角度射入空气中的水滴所引起的比较复杂的由折射和反射造成的一种现象,像这样:
本质是因为不同波长的光折射率不同,就从原本混合的单色光被分成了多种颜色。
但今天要做的不是这个……是这个:
这是一种风格化效果,貌似属于故障艺术的一种,也就是以前电视、电脑出了问题,就变成了这幅模样,逐渐也演变成了一种艺术性风格。
用后处理实现可以说是十分简单了,shader里片元着色器的输出颜色的rgb值是分别对rgb通道的_MainTex进行采样,并对采样坐标做不同的偏移。还可以加上时间参数做出动画。
这真的是个非常的简单的效果惹:
C#脚本
using UnityEngine;
[ExecuteInEditMode]
public class ColorDispersion : PostEffectsBase
{
public Shader shader;
private Material _material;
private Material Material
{
get
{
if (_material == null)
_material = CheckShaderAndMaterial(shader, _material);
return _material;
}
}
[Range(0,0.01f)]
public float scale = 0;
public float speed = 5;
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (Material != null)
{
Material.SetFloat("_Scale", scale);
Material.SetFloat("_Speed", speed);
Graphics.Blit(source, destination,Material);
}
else
{
Graphics.Blit(source, destination);
Debug.Log("Material == null !");
}
}
}
Shader
Shader "MyShaderTest/8_ColorDispersion"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Cull Off ZWrite Off ZTest Always
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;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
float _Scale;
float _Speed;
fixed4 frag(v2f i) : SV_Target
{
fixed3 col = fixed3(0,0,0);
fixed scale = _Scale * sin(_Time.y * _Speed);
scale = saturate(scale);
half2 uv_0 = half2(i.uv.x - scale,i.uv.y);
half2 uv_1 = half2(i.uv.x + scale, i.uv.y);
col.r = tex2D(_MainTex, uv_0).r;
col.g = tex2D(_MainTex, i.uv).g;
col.b = tex2D(_MainTex, uv_1).b;
return fixed4(col,1);
}
ENDCG
}
}
}