Unity3d Ugui图片上制作点光 、棱形光效果

实现的效果可以参考如下图所示

通过shader来实现上述的效果,为了大家的适应性,推荐在unity官方的默认ui shader上更改,我用的是2019.2.17版本。以下是链接

unity官方下载

查找对应版本选择built in shaders 下载
可以在路径builtin_shaders-2019.2.21f1\DefaultResourcesExtra\UI 下找到UI-Default.shader
在以此的基础上修改代码

类似点光的实现

点光本质来说形状就是一个圆,首先在Properties中需要定义圆心,和其半径

_CircleParameter("Circle Parameter",Vector)=(0.5,0.5,0.2,1) //xy 为圆心所在位置, z为半径 ,w为光线强度

接下来我们需要得到uv坐标下,每个点距离我们定义的圆的距离

float2 centrePoint=_CircleParameter.xy; //圆心
float dis=distance(IN.uv,centrePoint); //uv与圆心的距离

很明显,我们只需要 距离dis在圆半径_CircleParameter.z范围内的点,可以通过如下代码获得

float factor= step(dis,_CircleParameter.z);

factor 的值为 圆半径小于两点距离(_CircleParameter.z<dis)则为0,否则为1。step函数可以搜索CG 标准函数库查看相关概念。

接下里我们可以通过得到的factor为点光颜色去做裁剪,去掉圆以外的光颜色。很明显在圆以外的factor值都为0,只要将光颜色(_PointColor)的alpha值乘以factor。

_PointColor.a*=factor; //裁剪掉超出圆范围的光

有些图片上有透明元素,比如我在上面中使用的图片,显然这些透明的地方不应该显示光颜色,当然如果你想的话也可以。通过采样获取(color)的颜色 判断当前像素上是否透明,不需要显示。

_PointColor.a*=step(0.01,color.a); //裁剪掉透明处的光

光是有衰减的,我们可以通过如下一个简单的计算得到。

_PointColor.a*=1.0-(dis/_CircleParameter.z); //光的衰减

点距离圆心越近dis/_CircleParameter.z越小,但是很明显衰减是从圆心往外的,可以用去1去减使其相反。

最后只需要混合光的颜色和采样得到的颜色

color.rgb= color.rgb+_PointColor.rgb*_PointColor.a*_CircleParameter.w; //混合颜色 ,_CircleParameter.w为颜色强度

有时候我们会希望图片做一些裁剪,比如让它只显示圆的形状。那么我们只需要以上代码的基础上,通过采样颜色的alpha乘以factor就可以去掉范围以外的颜色。代码十分简单

color.a*=factor;

棱形光

基本思想与上面的圆类似,简单的来说,就是我们需要判断哪些点在这个棱形范围内。

上图中使用的是四边相等的棱形,并且顶点距离坐标中心为1,很明显此棱形在四边上的点有如下关系式 x+y=1(x和y分布都是x上距离坐标中心的距离,和y上距离坐标中心的距离)。那么在此棱形中的点显然 小于 x+y。只需要将uv坐标转换为上图以棱形为坐标系,可以很容易计算点是否在棱形内。代码如下

float ClipDiamond(float2 uv)//裁剪棱形
{float x=abs( uv.x-_CircleParameter.x);float y=abs( uv.y-_CircleParameter.y);return step(x+y,_CircleParameter.z);
}

最后把所有完整shader附上

Shader "Wjh/2DPoint"
{Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}_Color ("Tint", Color) = (1,1,1,1)_StencilComp ("Stencil Comparison", Float) = 8_Stencil ("Stencil ID", Float) = 0_StencilOp ("Stencil Operation", Float) = 0_StencilWriteMask ("Stencil Write Mask", Float) = 255_StencilReadMask ("Stencil Read Mask", Float) = 255_ColorMask ("Color Mask", Float) = 15[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0_PointColor("Point Color",Color)=(1,1,0,1) //点光的颜色_CircleParameter("Circle Parameter",Vector)=(0.5,0.5,0.2,1) //xy 为圆心所在位置, z为半径 ,w为光线强度[Toggle(USE_CLIP_SHAPE)] _UseClipShape("Use Clip Shape",Float)=0.0 //是否开启裁剪-圆[Toggle(USE_DIAMOND)] _UseDiamond("Use Clip Shape",Float)=0.0 //是否开启裁剪-圆}SubShader{Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent""PreviewType"="Plane""CanUseSpriteAtlas"="True"}Stencil{Ref [_Stencil]Comp [_StencilComp]Pass [_StencilOp]ReadMask [_StencilReadMask]WriteMask [_StencilWriteMask]}Cull OffLighting OffZWrite OffZTest [unity_GUIZTestMode] Blend SrcAlpha OneMinusSrcAlphaColorMask [_ColorMask]Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"#pragma multi_compile_local _ UNITY_UI_CLIP_RECT#pragma multi_compile_local _ UNITY_UI_ALPHACLIP//自定义裁剪宏#pragma shader_feature_local USE_CLIP_SHAPE //自定义棱形宏#pragma shader_feature_local USE_DIAMOND 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 uv  : TEXCOORD0;float4 objPosition : TEXCOORD1;UNITY_VERTEX_OUTPUT_STEREO };sampler2D _MainTex;fixed4 _Color;fixed4 _TextureSampleAdd;float4 _ClipRect;float4 _MainTex_ST;fixed4 _PointColor;fixed4 _CircleParameter;float _UseClipCircle;float _UseClipDiamond;v2f vert(appdata_t v){v2f OUT;//Gpu Instancing 相关UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);OUT.objPosition = v.vertex;OUT.vertex = UnityObjectToClipPos(OUT.objPosition);OUT.uv = TRANSFORM_TEX(v.texcoord, _MainTex);OUT.color = v.color * _Color;return OUT;}float ClipDiamond(float2 uv)//裁剪棱形{float x=abs( uv.x-_CircleParameter.x);float y=abs( uv.y-_CircleParameter.y);return step(x+y,_CircleParameter.z);}fixed4 frag(v2f IN) : SV_Target{fixed4 color = (tex2D(_MainTex, IN.uv) + _TextureSampleAdd) * IN.color;//图片裁剪#ifdef UNITY_UI_CLIP_RECTcolor.a *= UnityGet2DClipping(IN.objPosition.xy, _ClipRect);#endif#ifdef UNITY_UI_ALPHACLIPclip (color.a - 0.001);#endiffloat2 centrePoint=_CircleParameter.xy; //圆心float dis=distance(IN.uv,centrePoint); //uv与圆心的距离//是否开启裁剪棱形,否则圆#ifdef USE_DIAMOND float factor=ClipDiamond(IN.uv);#elsefloat factor= step(dis,_CircleParameter.z); //超出圆范围的因子为0,其余为1#endif_PointColor.a*=step(0.01,color.a); //裁剪掉透明处的光_PointColor.a*=factor; //裁剪掉超出圆范围的光//是否开启裁剪形状#ifdef USE_CLIP_SHAPEcolor.a*=factor; #endif_PointColor.a*=1.0-(dis/_CircleParameter.z); //光的衰减color.rgb= color.rgb+_PointColor.rgb*_PointColor.a*_CircleParameter.w; //混合颜色 ,_CircleParameter.w为颜色强度//color.rgb= (color.rgb*color.a+_PointColor.rgb*_PointColor.a*_CircleParameter.w)*step(0.001,_PointColor.a); //混合颜色 ,_CircleParameter.w为颜色强度return color;}ENDCG}}
}

谢谢。

Unity3d Ugui图片上制作点光 、棱形光效果shader,并具有裁切相关推荐

  1. Word怎么在图片上制作一个简历封面?

    Word怎么在图片上制作一个简历封面?Word中想要设计一个简历封面,该怎么设计呢?下面我们就来看看详细的制作方法,需要的朋友可以参考下 想要给自己的简历制作一个封面,该怎么制作一个风景图片效果的封面 ...

  2. html 图片鼠标移上去点亮,CSS3 实现鼠标移到图片上时一片亮光一闪而过的效果...

    01 效果描述 CSS3 实现鼠标移到图片上时一片亮光一闪而过的效果 02 效果图摘 03 关键代码 html: CSS: .hover14{ width:500px; float:left; } . ...

  3. 在图片上停留时逐渐增强或减弱的透明效果demo效果示例(整理)

    <!doctype html> <html lang="en"> <head><meta charset="UTF-8" ...

  4. 如何批量在图片上加二维码?

    二维码可以包含很多的信息,比如联系方式,个人简介等信息,所以很多小伙伴都想推广自己的二维码,所以有不少人将二维码加在图片上以达到更好的推广效果. 在图片上加二维码其实和在图片上加logo水印的方式是一 ...

  5. Unity3d UGUI半透明或线性渐变图片显示不正常(模糊)问题解决(颜色空间不匹配)

    问题 如题的问题,之前没遇到过,透明渐变的图片在预览和各种软件上查看都很正常,但是放入UGUI上就有模糊的问题. 在Inspector上(正常): 放到UGUI下: 各项设置都是默认: 解决方法 花了 ...

  6. 制作往图片里插入视频,视频添加到图片上播放

    在视频中还有个小视频同时播放,这种画中画的效果以前都学习过,那在图片上插入视频播放,可以用媒体梦工厂中的画中画功能来制作吗?这个肯定是可以的了.下面就来看看怎么的操作的吧. 先来看看图片加视频制作出来 ...

  7. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  8. 怎么弄自动滚动的图片 html,HTML网页上连续滚动图片的制作

    制作方法:相关文件:在页面 ~相关位置加入代码: 新建scrollimg-pic.htm页面,插入相同大小的图片若干张.为使它不停顿地连续播放,请在同一行中,连续插入图片二至三次.类似于文件.在每一张 ...

  9. 文件上传漏洞—一句话图片马制作

    文件上传漏洞-一句话图片马制作 提要:在文件上传漏洞中,通常需要上传脚本类型的文件至服务端执行,获取WebShell,但是网站会严格过滤脚本类型的文件,这个时候便可以通过图片马来尝试突破. 简介:在图 ...

最新文章

  1. 剑指offer:二叉树的下一个节点
  2. (三)构建模块——Web页面建设
  3. textarea中的换行符
  4. 学习笔记(四)——JavaScript(一)
  5. web项目怎么连接云服务器,web项目怎么连接云服务器
  6. Android开发之EditText限制输入中文以及字数长度限制的标准姿势
  7. 万能点位图软件_红色网格衣+很多漂亮的花边像素图,绣手帕花边的十字绣图...
  8. 庖丁解InnoDB之UNDO LOG
  9. [再寄小读者之数学篇](2014-11-14 矩阵的应用: 有限几何)
  10. 青岛Uber优步司机奖励政策(9月14日~9月20日)
  11. datatable java排序,JSF数据表(h:dataTable)DataModel排序数据
  12. 海康威视_摄像头搜索工具
  13. 简易网页音乐播放器制作
  14. SAP PM 第一节 PM后台配置
  15. 由内而外全面进化,影像娱乐都出彩,vivo S12 Pro上手
  16. 基于QT实现的图形软件图片编辑器
  17. 解决微信开发工具卡顿的问题
  18. WPS关闭不了后台一直运行的解决办法(wpscloudsvr.exe)
  19. Linux-Ubuntu-4-软件安装
  20. 苹果呼叫转移设置不了_手机不想接电话怎么设置为空号教程

热门文章

  1. LeetCode 576 出界的路经数
  2. 英文wiki技术基础问题查询的常见问题
  3. 【实战Docker】SVN服务
  4. LaTeX:字体字号榜值对比
  5. 解决海康威视摄像头无法通过路由器远程访问的问题
  6. 2023新年红包,兔年HTML红包页面代码【2023新年快乐_附源码】
  7. 小程序近期频繁更新 背后原因全面解读
  8. 利用iText.jar操作pdf文档
  9. 背包问题C/C++语言
  10. Nginx 菜鸟教程从初学到应用