这篇文章主要为大家详细介绍了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();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
织梦狗教程
本文标题为:Unity3D Shader实现扫描显示效果


基础教程推荐
猜你喜欢
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#中 Json 序列化去掉null值的方法 2022-11-18
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- Unity shader实现高斯模糊效果 2023-01-16
- C# 解析XML和反序列化的示例 2023-04-14
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C#中的Linq to JSON操作详解 2023-06-08
- 实例详解C#实现http不同方法的请求 2022-12-26