Shader "UI/ImageWithHole"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_TintColor ("Tint", Color) = (,,,) _StencilComp ("Stencil Comparison", Float) =
_Stencil ("Stencil ID", Float) =
_StencilOp ("Stencil Operation", Float) =
_StencilWriteMask ("Stencil Write Mask", Float) =
_StencilReadMask ("Stencil Read Mask", Float) = [KeywordEnum(ROUND, RECTANGLE, NULL)] _MaskMode("Mask mode", Float) =
_Center("Center", vector) = (, , , )
_Radius("Radius", Range(,)) = // 圆半径
_RectangleSize("Rectangle Size", vector) = (, , , ) // 矩形边长
_TransitionRange("Transition Range", Range(, )) =
} SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
} Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
} Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGBA Pass
{
Name "Default"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0 #include "UnityCG.cginc"
#include "UnityUI.cginc" #pragma multi_compile __ UNITY_UI_CLIP_RECT
#pragma multi_compile __ UNITY_UI_ALPHACLIP
#pragma multi_compile _MASKMODE_ROUND _MASKMODE_RECTANGLE _MASKMODE_NULL struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
}; fixed4 _TintColor;
fixed4 _TextureSampleAdd;
float4 _ClipRect;
float2 _Center;
half _Radius;
float2 _RectangleSize;
half _TransitionRange; v2f vert(appdata_t v)
{
v2f OUT;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
OUT.worldPosition = v.vertex;
OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); OUT.texcoord = v.texcoord; OUT.color = v.color * _TintColor;
return OUT;
} sampler2D _MainTex; fixed4 frag(v2f i) : SV_Target
{
half4 color = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color; #ifdef UNITY_UI_CLIP_RECT
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
#endif #ifdef UNITY_UI_ALPHACLIP
clip (color.a - 0.001);
#endif #ifdef _MASKMODE_ROUND
// 计算片元世界坐标和目标中心位置的距离
half dis = distance(i.worldPosition.xy, _Center.xy);
// 过滤掉距离小于(半径-过渡范围)的片元
clip(dis - (_Radius - _TransitionRange));
// 是否在圆里面
int inside = step(dis, _Radius);
// 计算过渡范围内的alpha值
color.a *= ( - inside) + inside * (dis - (_Radius - _TransitionRange)) / _TransitionRange;
#elif _MASKMODE_RECTANGLE
// 计算片元世界坐标和目标中心位置的距离
half disX = distance(i.worldPosition.x, _Center.x);
half disY = distance(i.worldPosition.y, _Center.y);
// x决定像素点应该去掉返回1,不去掉返回0
int clipX = step(disX, _RectangleSize.x-_TransitionRange);
int clipY = step(disY, _RectangleSize.y-_TransitionRange);
clip(disX - (_RectangleSize.x -_TransitionRange) * clipY);
clip(disY - (_RectangleSize.y -_TransitionRange) * clipX); // x在范围内返回1,不在范围内返回0
int insideX = step(disX, _RectangleSize.x);
int insideY = step(disY, _RectangleSize.y);
half alphaX= ( - insideX) + insideX * (disX - (_RectangleSize.x - _TransitionRange)) / _TransitionRange;
half alphaY= ( - insideY) + insideY * (disY - (_RectangleSize.y - _TransitionRange)) / _TransitionRange;
color.a *= max(alphaX, alphaY);
#endif
return color;
}
ENDCG
}
}
}

Shader实现新手指引挖空圆形和矩形的更多相关文章

  1. iOS: 首次使用App时,显示半透明新手指引

    在很多的app,我们都会发现这样一个功能:就是app启动后进入主界面时,会有一个半透明的指引图,它会提示用户如何一步步进行操作,快速的熟悉app的使用规则,极大地方便了用户的使用,也加快了app的推广 ...

  2. 40.Android之新手指引界面学习

    我们经常可以看到打开新App会有新手指引界面,类似蒙板效果今天来学习.原理其实很简单,设置一个透明Activity或者Dialog,然后修改其属性即可.由于实现比较简单,就贴一部分代码. 1.在And ...

  3. [MarsZ]Unity3d游戏开发之Unity3d全策划配置新手指引

    Unity3d全策划配置新手指引 前言... 2 版本... 2 作者... 2 功能... 2 类型... 2 触发类型... 2 步骤类型... 3 实现... 4 简要... 4 策划方面... ...

  4. 使用Three.js挖空安装门来解决重叠闪烁的问题

    一.挖空原理说明 subtract 用墙面减去与门重叠的部分,产生一个新的对象,导入材质安装门即可 //参与减去几何体 //平行于x轴门 var meshH4Door = new ThreeBSP( ...

  5. ArcGIS案例学习笔记-批处理擦除挖空挖除相减

    ArcGIS案例学习笔记-批处理擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:批处理擦除.挖空.挖除.相减 数据源:chp13/ex5/pa ...

  6. ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减

    ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:手动编辑擦除.挖空.挖除.相减 1. 选中内部要素 2. c ...

  7. 开源整理:Android App新手指引开源控件

    开源整理:Android App新手指引开源控件 一个App第一次与用户接触或者发生大版本更新时,常常会用户进行新手引导,而一个好的新手指引,往往能够方便新用户快速了解操作你的应用功能.新手指引的重要 ...

  8. 转载: 开源整理:Android App新手指引开源控件

    http://blog.coderclock.com/2017/05/22/android/open-source-android-app-guide-view-library/ 开源整理:Andro ...

  9. 新手指引,php什么是常量、变量、数组、类和对象及方法?

    众所周知,常量.变量.数组.类和对象及方法共同构成了PHP的基石.那么什么是常量?什么是变量?什么是数组?什么是类和对象及方法?我在此谈谈个人浅见,新手指引,高手勿喷. PHP 常量 定义:常量是单个 ...

随机推荐

  1. read more阅读更多,文字超过三行字符后面添加省略号

    var text;$('.blog-item').each(function (i) {text = $(this).find('.blog-excerpt').html();if (text.len ...

  2. d3js 折线图+柱图

    <!DOCTYPE html> <html> <body> <div id="vis"><svg></svg> ...

  3. BZOJ 4319: cerc2008 Suffix reconstruction(后缀数组)

    题面 Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊,小C 程序中的原字符数组就 ...

  4. Sqli labs系列-less-2 详细篇

    就今天晚上一个小插曲,瞬间感觉我被嘲讽了. SQL手工注入这个东西,杂说了吧,如果你好久不玩的话,一时说开了,你也只能讲个大概,有时候,长期不写写,你的构造语句还非常容易忘,要不我杂会被瞬间嘲讽了啊. ...

  5. (转)Linux 多线程编程---pthread_testcancel()等讲解

    1.   所谓线程就是“一个进程内部的一个控制序列”.也就是一个进程内部的并行的基础! 2.    Linux进程可以看成只有一个控制线程:      一个进程在同一时刻只做一件事情.有了多个控制线程 ...

  6. CSS template

    ylbtech-CSS3: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cn ...

  7. 2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)

    题目链接:https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合 ...

  8. 剑指offer——74求1+2+3+n

    题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C).   题解: 利用类的构造和析构 //利用类的构 ...

  9. Jenkins和Docker

    由于采用了Docker版的Jenkins,导致在Jenkins里无法调用Docker命令行工具进行Docker镜像构建 有三种解决方案: 1. 安装Docker插件,利用Jenkins插件进行构建 2 ...

  10. leetcode.字符串.696计数二进制子串-java

    1. 具体题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的.重复出现的子串要计算它们出现的次数. 示例 1 : 输入: ...