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. three.js低版本添加文字(如71版本)

    研究了半天,最后终于加载成功了,记录一下three.js 71版本的文字加载,下面开始整个过程 首先,将ttf字体转换成js文件 源码版: https://github.com/gero3/facet ...

  2. IntelliJ IDEA下载地址

    http://www.jetbrains.org/display/IJOS/Download

  3. react react使用css

    在react 中使用css有以下几种方法 第一种全局使用 app.js import React from 'react'; import Router from "./router&quo ...

  4. java 后台 实现简单的验证码

    private int width =80;private int height=30;private Random r=new Random();private String fontnames[] ...

  5. 提取json对象中的数据,转化为数组

    var xx1 = ["乐谱中的调号为( )调", "写出a自然小调音阶.", "以G为冠音,构写增四.减五音程.", "调式分析 ...

  6. nginx配置跨域

    location / { if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' '*' always;a ...

  7. 调用phone库,查询手机号码归属地(4)

    需要安装pymysql,phone库 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, pymysql, logging, phone fro ...

  8. Django学习铺垫

    Web框架本质 所有的web服务本质都是一个socket服务端,用户浏览器就是一个socket客户端,这样就实现了自己的web框架 ,但是自己的写的框架肯定很low,各种工能崩溃,所以我们就要学习py ...

  9. 2019-9-2-win10-uwp-布局

    title author date CreateTime categories win10 uwp 布局 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17: ...

  10. python sorted()的简单使用

    今天在学习python的时候,碰到了sorted()这个函数,其作用是在不改变列表排序的情况下,将列表的内容按照特定的顺序表示出来. 在练习的时候,编辑了几条命令进行测试. cars=['bmw',' ...