屏幕可视范围跟随目标物体移动,可修改可视范围大小,边缘渐变大小、以及遮罩颜色,支持最高物体数量可在Shader中修改,当前版本支持最多9个物体。

效果图如下:

控制面板如下:

Shader代码如下:

Shader "Peter/DarkEffect"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{// No culling or depthCull Off ZWrite Off ZTest AlwaysPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"//追踪物体最多个数#define ItemSize 9struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;fixed4 _DarkColor;float _SmoothLength;fixed _ItemCnt;float4 _Item[ItemSize];v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}fixed CalcAlpha(float4 vt, float4 pt){if(pt.z < 0){return 1;}float distPow2 = pow(vt.x - pt.x, 2) + pow(vt.y - pt.y, 2);float dist = (distPow2 > 0) ? sqrt(distPow2) : 0;float smoothLength = _SmoothLength;if(smoothLength < 0){smoothLength = 0;}float maxValue = pt.z;float minValue = pt.z - smoothLength;if(minValue < 0){minValue = 0;smoothLength = pt.z;}if(dist <= minValue){return 0;}else if (dist > maxValue){return 1;}fixed retVal = (dist - minValue) / smoothLength;return retVal;}fixed4 frag (v2f i) : SV_Target{fixed alphaVal = 1;fixed tmpVal = 1;for(fixed index = 0; index < _ItemCnt; ++index){tmpVal = CalcAlpha(i.vertex, _Item[index]);if(tmpVal < alphaVal){alphaVal = tmpVal;}}alphaVal *= _DarkColor.a;return tex2D(_MainTex, i.uv) * ( 1 - alphaVal) + _DarkColor * alphaVal;}ENDCG}}
}

C#调用代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class DarkEffect : MonoBehaviour
{[System.Serializable]public class Item{[SerializeField]public Transform target;[SerializeField]public int radius;public Vector3 GetScreenPosition(Camera cam){return cam.WorldToScreenPoint(target.position);}}//渐变像素数量public int _smoothLength = 20;//遮罩混合颜色public Color _darkColor = Color.black;//目标物体public List<Item> _items = new List<Item>();protected Material _mainMaterial;protected Camera _mainCamera;Vector4[] _itemDatas;Item _tmpItem;Vector4 _tmpVt;Vector3 _tmpPos;int _tmpScreenHeight;private void OnEnable(){_mainMaterial = new Material(Shader.Find("Peter/DarkEffect"));_mainCamera = GetComponent<Camera>();}private void OnRenderImage(RenderTexture source, RenderTexture destination){if (_itemDatas == null || _itemDatas.Length != _items.Count){_itemDatas = new Vector4[_items.Count];}_tmpScreenHeight = Screen.height;for (int i = 0; i < _items.Count; i++){_tmpItem = _items[i];_tmpPos = _tmpItem.GetScreenPosition(_mainCamera);_tmpVt.x = _tmpPos.x;_tmpVt.y = _tmpScreenHeight - _tmpPos.y;_tmpVt.z = _tmpItem.radius;_tmpVt.w = 0;_itemDatas[i] = _tmpVt;}_mainMaterial.SetInt("_SmoothLength", _smoothLength);_mainMaterial.SetColor("_DarkColor", _darkColor);_mainMaterial.SetInt("_ItemCnt", _itemDatas.Length);_mainMaterial.SetVectorArray("_Item", _itemDatas);Graphics.Blit(source, destination, _mainMaterial);}
}

[Unity3D]Shader编程之动态屏幕遮罩相关推荐

  1. 【Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)屏幕像素化特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.    文章链接:  http://blog.csdn.net/poem_qianmo/article/details/50095705 作者:毛星云 ...

  2. 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 amp; 纹理混合...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星 ...

  3. 【Unity3D Shader编程】之一 夏威夷篇 游戏场景的创建 第一个Shader的书写

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  4. Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...

  5. 【Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 纹理混合

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/41175585 作者:毛星云(浅墨) ...

  6. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...

  7. 【Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/42215079 作者:毛星云(浅墨) ...

  8. Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/42215079 作者:毛星云(浅墨) ...

  9. 【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

    本文主要讲解了Unity中SurfaceShader的具体写法,以及几个常用的CG函数的用法. 在这里先说明一下,表面着色器将分为两次讲解,本文介绍表面着色器的基本概念和一些写法,用内置的兰伯特光照模 ...

最新文章

  1. 渗透测试辅助工具--在线版
  2. 匿名类java的说明_Java8 Lambdas与匿名类
  3. 图像分割matlab_基于MATLAB的指针示数识别
  4. PHP优于Node.js的五大理由
  5. java 中 transient关键字
  6. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(2)
  7. c# -- 动态生成查询lamda表达式
  8. 将地址强制转换为指针
  9. 前端笔记-201805
  10. smart3D的初探索
  11. Fibonacci Heaps
  12. ubuntu20.04设置开机启动
  13. 三国论(16-20章)
  14. premiere导入视频没有声音怎么办?快速解决方法,几步就搞定
  15. 数据库kettle,datax,DBMigration,RazorSQL几款迁移工具使用感受(以及如何迁移表的结构如主键,索引,约束等)
  16. echart可视化图表多条折线显示数据混乱问题
  17. KeyBERT进行中文关键词提取
  18. Chrome的插件安装与使用
  19. 微信是如何做用户体验的?
  20. 股票-集合竟价与连续竟价

热门文章

  1. layui+poi 做 导入 Excel
  2. 数据库中范式的分类和它们之间的转化
  3. BENTLY卡件125680-01、3500/42M140734-02、125760-01、149992-01、1900/65A(167699-02)、1900/65A-01-02-01-00-00
  4. C语言连接两个字符串
  5. RestTemplat
  6. Docker+jenkins+maven自动化部署
  7. stm32的温湿度监控
  8. matlab使用匹配滤波器构建相关接收机解调BPSK信号
  9. ood 面向对象分析 设计模式课程总结
  10. hdu训练赛 火球术(组合数打表)