我看了下shader这东西要玩深也是要经年积累的,按一般的顺序从漫反射到镜面反射等等那样来的话,太费精力。
我这次是要作一个游戏开发技能的系统学习总结,所以shader这块大致的计划是以手头项目为依托,先看懂其中用到的大概三个,包括黑屏和两个轮廓描边,再自主编写一到两个有实际需求的,包括一个黑幕扩散、一个墙体后的人物透视,最后再做一个稍微酷炫些的比如钻石光效之类的,然后就收手转入下一块。
计划时间在一个月左右,不知道实际进展如何,根据情况再调整吧。
黑屏的常见性不多说了,先贴个效果图:
有些教程会把全屏特效当做高级内容放在最后讲,但是我觉得从难度来讲并无高低关系,相反这个貌似更容易一些。
基本的unity shader上手操作方式也不赘述了,随便找篇文章或是看官方文档都能搞定。
乐乐同学的这篇文章已经把该讲的东西都讲得很清楚了,我的控制脚本也是拷得她的,只稍作了细小改动加了个editor range变量。
这里就偷个懒直接贴地址了:
【Unity Shaders】使用Unity Render Textures实现画面特效——建立画面特效脚本系统
下面是我的控制脚本,绑在Camera下。
OnRenderImage、Graphics.Blit这些去Unity官方文档的ImageEffects目录下找也都有介绍。
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class ScreenEffects : MonoBehaviour {
[SerializeField][Range (0, 1)]
public float darkPercent;
public Color color;
public Shader shader;
private Material curMaterial;
public Material material
{
get
{
if (curMaterial == null)
{
curMaterial = new Material(shader);
curMaterial.hideFlags = HideFlags.HideAndDontSave;
}
return curMaterial;
}
}
void Start()
{
if (SystemInfo.supportsImageEffects == false)
{
enabled = false;
return;
}
if (shader != null && shader.isSupported == false)
{
enabled = false;
}
}
void OnDisable()
{
if (curMaterial)
{
DestroyImmediate(curMaterial);
}
}
void Update()
{
color = Color.Lerp(Color.white, Color.black, darkPercent);
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (shader != null)
{
material.SetColor("_Color", color);
Graphics.Blit(source, destination, material);
}
else
{
Graphics.Blit(source, destination);
}
}
}
下面是shader,很简单,该说的都在注释里了:
Shader "MyShader/BlackScreen" {
Properties {
_Color("Main Color", Color) = (0.5,0.5,0.5,0.5)
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert_img //vert_img在UnityCG.cginc里有预定义的函数体,是最普通的顶点处理函数
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
sampler2D _MainTex; //这两个变量一定要在CGPROGRAM中定义一次,不要看Properties里有就不写了
float4 frag (v2f_img i) : COLOR {
float4 col = tex2D(_MainTex, i.uv) * _Color; //简单的两个float4点乘,刚好乘白色不变,乘纯黑就黑透,不一定是纯线性关系但表现效果没问题
return col;
}
ENDCG
}
}
Fallback off
}