Unity3D Shader实现扫描显示效果

本文实例为大家分享了Unity3D Shader实现扫描显示的具体代码,供大家参考,具体内容如下

通过Shader实现,从左向右的扫描显示,可自定义扫描颜色、宽度、速度。

效果图如下

编辑器界面如下

Shader源码如下

Shader "XM/ScanEffect"
{
 Properties
 {
 _MainTex("Main Tex", 2D) = "white"{}
 _lineColor("Line Color", Color) = (0,0,0,0)
 _lineWidth("Line width", Range(0, 1.0)) = 0.1
 _rangeX("Range X", Range(0,1.0)) = 1.0
 }

 SubShader
 {
 Tags {
 "Queue" = "Transparent"
 }

 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha
 Cull back

 Pass
 {
 CGPROGRAM

 #pragma vertex vert
 #pragma fragment frag

 #include "Lighting.cginc"

 sampler2D _MainTex;
 float4 _MainTex_ST;
 float4 _lineColor;
 float _lineWidth;
 float _rangeX;

 struct a2v
 {
 float4 vertex : POSITION;
 float4 texcoord : TEXCOORD0;
 };

 struct v2f
 {
 float4 pos : SV_POSITION;
 float2 uv : TEXCOORD0;
 };

 v2f vert(a2v v)
 {
 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
 return o;
 }

 fixed4 frag(v2f i) : SV_TARGET
 {
 fixed4 col = tex2D(_MainTex, i.uv);

 if(i.uv.x > _rangeX)
 {
  clip(-1);
 }
 else if (i.uv.x > _rangeX - _lineWidth)
 {
  float offsetX = i.uv.x - _rangeX +_lineWidth;
  fixed xAlpha = offsetX / _lineWidth;
  col = col * (1 - xAlpha) + _lineColor * xAlpha;
 }

 return col;
 }

 ENDCG
 }
 }

 FallBack "Diffuse"
}

代码调用如下

using UnityEngine;
using System.Collections;
public class ScanEffect : MonoBehaviour
{
 //默认扫描线的宽
 [Range(0,1)]
 public float _defaultLineW = 0.2f;
 //扫描的速度
 [Range(0, 1)]
 public float _showSpeed = 0.02f;

 private MeshRenderer _render;

 private void Awake()
 {
 _render = GetComponent<MeshRenderer>();
 SetX(0);
 SetLineWidth(0);
 }

 public void SetLineWidth(float val)
 {
 _render.material.SetFloat("_lineWidth", val);
 }
 public void SetX(float val)
 {
 _render.material.SetFloat("_rangeX", val);
 }

 public void Show()
 {
 StopCoroutine("Showing");
 StartCoroutine("Showing");
 }
 public void Hide()
 {
 StopCoroutine("Showing");

 SetX(0);
 SetLineWidth(0);
 }

 private IEnumerator Showing()
 {
 float deltaX = 0;
 float deltaWidth = _defaultLineW;

 SetX(deltaX);
 SetLineWidth(deltaWidth);

 while (true)
 {
 if (deltaX != 1)
 {
 deltaX = Mathf.Clamp01(deltaX + _showSpeed);
 SetX(deltaX);
 }
 else
 {
 if (deltaWidth != 0)
 {
  deltaWidth = Mathf.Clamp01(deltaWidth - _showSpeed);
  SetLineWidth(deltaWidth);
 }
 else
 {
  break;
 }
 }
 yield return new WaitForEndOfFrame();
 }
 }

 public void OnGUI()
 {
 if (GUILayout.Button("Show"))
 {
 Show();
 }
 if (GUILayout.Button("Hide"))
 {
 Hide();
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D Shader实现扫描显示效果(2)

    上一篇使用的方式是对UV进行剪裁,如果用于模型的话,会出现一些问题.本篇使用的方式是对模型进行模型空间的剪裁,可设置剪裁方向.效果如下: 设置界面如下: mode用于设置剪裁方向. clip用于设置剪裁值. shader实现如下: Shader "XM/ScanEffect2" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = &q

  • Unity3D Shader实现扫描显示效果

    本文实例为大家分享了Unity3D Shader实现扫描显示的具体代码,供大家参考,具体内容如下 通过Shader实现,从左向右的扫描显示,可自定义扫描颜色.宽度.速度. 效果图如下 编辑器界面如下 Shader源码如下 Shader "XM/ScanEffect" { Properties { _MainTex("Main Tex", 2D) = "white"{} _lineColor("Line Color", Colo

  • Unity3D Shader实现动态星空

    本文实例为大家分享了Unity3D Shader实现动态星空的具体代码,供大家参考,具体内容如下 Shader "Unlit/Test" { Properties { [Gamma][Header(CubeMap)]_MainColor("MainColor",COLOR)=(0.5,0.5,0.5,1) _Spec("Spec",Range(1,8))=1 [NoScaleOffset]_Tex("CubeMap",CUBE

  • Unity3D Shader实现镜子效果

    本文实例为大家分享了Unity3D Shader实现镜子效果的具体代码,供大家参考,具体内容如下/p> Shader部分代码: Shader "Custom/FanShe" { Properties{ _MainTex("Albedo",2D) = "white"{} _MainTint("Diffuse Color",Color)=(1,1,1,1) _Cubemap("Cubemap",CUBE)

  • Unity3D Shader实现流光效果

    本文实例为大家分享了Unity3D Shader实现流光效果的具体代码,供大家参考,具体内容如下 流光效果图: 演示工程:下载地址 //功能需求:模拟数据传送效果,高亮色块从模型上方移动到下方 //功能分析:这里采用UV动画的方式来实现,利用Alpha贴图控制流动的形状 // 利用Alpha遮罩贴图,控制模型中哪些地方需要进行流动 Shader "Custom/DataFlowEffect" { Properties { _MainColor("Main Color"

  • Unity3D Shader实现贴图切换效果

    本文实例为大家分享了shader实现基于世界坐标的贴图置换效果. 效果如下: 设置面板如下: 可在面板上设置切换方向,与切换对象,及其切换速度. shader实现如下: Shader "XM/Effect/SwapTexture" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Targ

  • Unity3D Shader实现动态屏幕遮罩

    屏幕可视范围跟随目标物体移动,可修改可视范围大小,边缘渐变大小.以及遮罩颜色,支持最高物体数量可在Shader中修改,当前版本支持最多9个物体. 效果图如下: 控制面板如下: Shader代码如下: Shader "Peter/DarkEffect" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { // No culling or depth Cull Off

  • Android仿微信、QQ附近好友雷达扫描效果

    1.概述 最近一直到在带实习生,因为人比较多,所以很长一段时间没有更新博客了,今天更新一篇雷达扫描附近好友效果,以后尽量每周更新一篇,先看一下效果: 2.实现 1.效果分析 效果分为两个部分,一个是上半部分的自定义RadarView,还有就是下半部分的ViewPager,至于怎么做到缩放和背景虚化的效果大家可以去看看LazyViewPager这里不详细介绍,这里主要实现扫描效果部分. 2.扫描效果实现 2.1自定义RadarView在onDraw()方法中画六个圆圈,至于圆圈的半径是多少我们需要

  • Android仿QQ附近的人搜索展示功能

     1.概述 老规矩,先上图 原装货(就不录制gif了,大家可以自己在Q群助手开启共享地理位置,返回群聊天页面就看到看到附近的人): 看起来还是挺像的吧. 通过观察,我们可以获取得到如下关系 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollView来试试) 2.上面的扫描图,肯定是个ViewGroup(因为里面的小圆点是可以点击的,如果是View的话,对于这些小圆点的位置的判断,以及对小圆点缩放动画的处理都会超级麻烦,难以实现)

  • Unity3D旧电视滤镜shader的实现示例

    实现思路 既然是要实现旧电视的后处理效果,那么只要回忆一下那些古旧的电视的显示效果然后进行模拟就可以了. 1.首先那种大头电视一般屏幕有一些曲率,并不是完全的一个平面,而且一般是向外凸起,这种凸起会造成中间的显示区域会比原来更近一些,边缘的显示区域会比原来更远一些.这种效果我们直接用简单的二次函数来实现. 2.那种老旧电视会有不断运动的噪声,我们直接使用噪声函数加上时间变量来实现. 3.屏幕上会有一些条纹效果,这种周期性的条纹效果一般用三角函数来实现. 当然不可能模拟的完全准确..也没有完全准确

随机推荐