Unity3D Shader实现扫描显示效果

所属分类: 软件编程 / C#教程 阅读数: 76
收藏 0 赞 0 分享

本文实例为大家分享了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();
 }
 }
}

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

更多精彩内容其他人还在看

C#获取并修改文件扩展名的方法

这篇文章主要介绍了C#获取并修改文件扩展名的方法,实例分析了C#编程方式修改文件扩展名的技巧,涉及Path类的使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历操作系统下所有驱动器的方法

这篇文章主要介绍了C#遍历操作系统下所有驱动器的方法,涉及C#中DriveInfo类GetDrivers方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历指定目录下所有文件的方法

这篇文章主要介绍了C#遍历指定目录下所有文件的方法,实例分析了C#中GetFiles()方法遍历文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#拷贝文件简单实现方法

这篇文章主要介绍了C#拷贝文件简单实现方法,主要分析了FileInfo类中CopyTo方法针对文件复制的操作技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#获取文件相关信息的方法

这篇文章主要介绍了C#获取文件相关信息的方法,涉及C#中FileInfo类的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#交错数组用法实例

这篇文章主要介绍了C#交错数组用法,较为详细的分析了交错数组的概念、用法并实例分析了交错数组的使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现在前端网页弹出警告对话框(alert)的方法

这篇文章主要介绍了C#实现在前端网页弹出警告对话框(alert)的方法,涉及C#通过自定义函数调用window.alert方法弹出对话框的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现控制Windows系统关机、重启和注销的方法

这篇文章主要介绍了C#实现控制Windows系统关机、重启和注销的方法,涉及C#调用windows系统命令实现控制开机、关机等操作的技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取Excel并转化成XML的方法

这篇文章主要介绍了C#读取Excel并转化成XML的方法,实例分析了C#操作Excel及XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#创建一个Word并打开的方法

这篇文章主要介绍了C#创建一个Word并打开的方法,实例分析了C#操作word的常用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多