三言两语说shader(二)黑屏效果

我看了下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
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值