游戏中经常需要制作出白光扫描的效果,这道光在透明区域不会显示。如果用图片叠加可能透明区域不太好处理,这里可通过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. Djanggo ORM操作

    Django ORM那些相关操作  一般操作 看专业的官网文档:https://docs.djangoproject.com/en/1.11/ref/models/querysets/,做专业的程序员 ...

  2. c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)

    部门数据库的设计: 代码: /// <summary> /// 获取部门(入口) /// </summary> /// <returns></returns& ...

  3. C#检测本机是否联网

    public class Net { [DllImport("wininet")] private extern static bool InternetGetConnectedS ...

  4. PCA与KPCA

    PCA是利用特征的协方差矩阵判断变量间的方差一致性,寻找出变量之间的最佳的线性组合,来代替特征,从而达到降维的目的,但从其定义和计算方式中就可以看出,这是一种线性降维的方法,如果特征之间的关系是非线性 ...

  5. php处理手机号中间的四位为星号****

    在显示用户列表的场景中,一般用到手机号的显示时都需要对手机号进行处理,一般是把中间的四位换成星号****,我本人用php处理的思路是进行替换,用****替换手机号的中间四位 代码如下: $all_lo ...

  6. ABAP 面向对象事件处理

    面向对象事件在ABAP中十分重要,并且很容易处理. 我们需要handler方法来注册事件: METHODS : handle_event_raised FOR EVENT event_raised O ...

  7. i.s.h.med Enhancement for cancelling an appointment

    This article intends to introduce my experience about enhancement for canceling an appointment. I tr ...

  8. 使用golang求出A-Z的所有子集

    参考链接:https://blog.csdn.net/K346K346/article/details/80436430 有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C ...

  9. POI生成Web版Word文件

    POI生成Web版Word文件 1       通过URL的输入流实现 2       直接把Html文本写入到Word文件 所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到 ...

  10. SharePoint在管理中心创建Secure Store

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/35780063 SharePoint在管理中心 ...