游戏中经常需要制作出白光扫描的效果,这道光在透明区域不会显示。如果用图片叠加可能透明区域不太好处理,这里可通过shader实现。

Shader "Custom/LogoShader" {
Properties {
_MainTex ("Texture", 2D) = "white" { }
}
SubShader
{
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater 0.1
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" sampler2D _MainTex;
float4 _MainTex_ST; struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
}; //顶点函数没什么特别的,和常规一样
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
} //必须放在使用其的 frag函数之前,否则无法识别。
//核心:计算函数,角度,uv,光带的x长度,间隔,开始时间,偏移,单次循环时间
float inFlash(float angle,float2 uv,float xLength,int interval,int beginTime, float offX, float loopTime )
{
//亮度值
float brightness =; //倾斜角
float angleInRad = 0.0174444 * angle; //当前时间
float currentTime = _Time.y; //获取本次光照的起始时间
int currentTimeInt = _Time.y/interval;
currentTimeInt *=interval; //获取本次光照的流逝时间 = 当前时间 - 起始时间
float currentTimePassed = currentTime -currentTimeInt;
if(currentTimePassed >beginTime)
{
//底部左边界和右边界
float xBottomLeftBound;
float xBottomRightBound; //此点边界
float xPointLeftBound;
float xPointRightBound; float x0 = currentTimePassed-beginTime;
x0 /= loopTime; //设置右边界
xBottomRightBound = x0; //设置左边界
xBottomLeftBound = x0 - xLength; //投影至x的长度 = y/ tan(angle)
float xProjL;
xProjL= (uv.y)/tan(angleInRad); //此点的左边界 = 底部左边界 - 投影至x的长度
xPointLeftBound = xBottomLeftBound - xProjL;
//此点的右边界 = 底部右边界 - 投影至x的长度
xPointRightBound = xBottomRightBound - xProjL; //边界加上一个偏移
xPointLeftBound += offX;
xPointRightBound += offX; //如果该点在区域内
if(uv.x > xPointLeftBound && uv.x < xPointRightBound)
{
//得到发光区域的中心点
float midness = (xPointLeftBound + xPointRightBound)/; //趋近中心点的程度,0表示位于边缘,1表示位于中心点
float rate= (xLength -*abs(uv.x - midness))/ (xLength);
brightness = rate;
}
}
brightness= max(brightness,); //返回颜色 = 纯白色 * 亮度
float4 col = float4(,,,) *brightness;
return brightness;
} float4 frag (v2f i) : COLOR
{
float4 outp; //根据uv取得纹理颜色,和常规一样
float4 texCol = tex2D(_MainTex,i.uv); //传进i.uv等参数,得到亮度值
float tmpBrightness;
tmpBrightness =inFlash(,i.uv,0.25f,5f,2f,0.15,0.7f); //图像区域,判定设置为 颜色的A > 0.5,输出为材质颜色+光亮值
if(texCol.w >0.5)
outp =texCol+float4(,,,)*tmpBrightness;
//空白区域,判定设置为 颜色的A <=0.5,输出空白
else
outp =float4(,,,); return outp;
}
ENDCG
}
}
}

运行效果:

扫描shader的更多相关文章

  1. 3000本IT书籍下载地址

    http://www.shouce.ren/post/d/id/112300    黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299    黑 ...

  2. Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)

     Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二) 附录文章1介绍了线性渐变渲染器. Android的SweepGradient梯度渐变扫描,重点是在构造Swe ...

  3. android shader 用法

    转自 http://blog.csdn.net/abcdef314159 http://blog.csdn.net/aigestudio/article/details/41799811 Shader ...

  4. 详解Paint的setShader(Shader shader)

    一.概述 setShader(Shader shader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类.Shader在三维软件中我们称之为着色器,其作用 ...

  5. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

  6. Android 颜色渲染(八) SweepGradient扫描/梯度渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Android 颜色处理(八) SweepGradient 扫描/梯度渲染 为什么什么叫扫描渲染呢?  相信大家都看过雷达扫描的 ...

  7. Android 颜色渲染(三) Shader颜色渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 相信看过在上一篇中提到的三篇文章后,大家已经对颜色处理方面有更深的体会. 之前讲到颜色渐变的效果, 具体怎么做呢,这就需要应用颜色渲染. 首先要介 ...

  8. 渲染器 Shader BitmapShader

    渲染模式: tileX tileY:The tiling mode for x/y to draw the bitmap in.   在位图上 X/Y 方向 瓦工/花砖/瓷砖 模式 CLAMP  :如 ...

  9. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

随机推荐

  1. 浅谈sql server聚集索引与非聚集索引

    今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...

  2. SQLSERVER 死锁

    select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tra ...

  3. 校园网下对VMware网络的配置

    1.参考:https://jingyan.baidu.com/article/8275fc8675c22646a03cf6b8.html 2.因为校园网的每一次连接都是自动获得IP地址的,所以虚拟机要 ...

  4. Ubuntu18.04 更换源

    在虚拟机新建一个Ubuntu18.04.1-live-server-amd64当做服务器 在安装软件时报错: slave@slave:~$ sudo -s[sudo] password for sla ...

  5. Linux 小知识翻译 - 「模块」

    说起module(模块),有的像「可热插拔的零部件」的意思. 在讨论Linux时提到的模块一般是指可以组装到内核中的模块. 模块这个概念是在硬件和程序设计领域中广泛使用的概念.我们这次说的模块特指Li ...

  6. mysql字符串查询常用命令

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql' ...

  7. 【美妙的Python之三】Python 对象解析

    美妙的Python之Python对象         简而言之: Python 是能你无限惊喜的语言.与众不同.         Python对象概念的理解,是理解Python数据存储的前提.Pyth ...

  8. java web,从零开始,一步一步配置ssm(Spring+SpringMVC+MyBatis)框架

    1.安装JDK: 安装之后要配置环境变量,在系统变量里: 新建变量名JAVA_HOME,变量值C:\Program Files\Java\jdk1.8.0_77: 新建变量名CLASSPATH,变量值 ...

  9. rac添加新节点的步骤与方法

    [转载] https://www.cnblogs.com/hankyoon/p/5174465.html OS: [root@rac ~]# more /etc/oracle-releaseOracl ...

  10. 自己编写的Shell

    shell文件 #!/bin/sh ## param 1: log string #下面的$1指的是调用这个function时传过来的第一个参数,依次类推 $2第二个 $3第三个funcLog() { ...