Unity UI.Image 六边形+流光 Shader

这篇具有很好参考价值的文章主要介绍了Unity UI.Image 六边形+流光 Shader。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图

Unity UI.Image 六边形+流光 Shader,Unity,unity,ui,游戏引擎

参考代码

Shader"Custom/HexFlowImage"
{
    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

         /*六边形参数*/
        _HexLineSize("HexLineSize",Range(0.02,0.2)) = 0.05       //线条粗细
        _HexZoom("HexZoom",Range(5,50)) = 10                     //六边形缩放
 
        /*流光参数*/
        _Angle("Angle",Range(0,3.1415926))=0                     //坐标系旋转角度
        _LineStrength("LineStrength",Range(0.01,0.99))=0.1       //流光线条粗细
        _LineEdge("LineEdge",Range(0,0.1))=0.01                  //流光边界过度粗细
        _LineOffset("LineOffset",Range(0,1))=0.5                 //流光坐标偏移
        _LineSpeed("MoveSpeed",float) =1                         //流光移动速度
        _LineColor("Color",Color)=(1,1,1,1)                      //流光颜色

        [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 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 Off
        Lighting Off
        ZWrite Off
        ZTest[unity_GUIZTestMode]
        Blend One
        OneMinusSrcAlpha
        ColorMask[_ColorMask]

        Pass
        {
            Name"Default"
            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
            #define aspec _ScreenParams.x/_ScreenParams.y                          /*屏幕长款比例*/                                   
            #define rot float2x2(cos(_Angle),sin(_Angle),-sin(_Angle),cos(_Angle)) /*旋转矩阵*/        
            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;
                   float4 mask : TEXCOORD2;
                   float2 viewTexcoord : TEXTCOORD3;   //屏幕坐标
                   UNITY_VERTEX_OUTPUT_STEREO
              };

               sampler2D _MainTex;
               fixed4 _Color;
               fixed4 _TextureSampleAdd;

               float4 _ClipRect;
               float4 _MainTex_ST;
               float _UIMaskSoftnessX;
               float _UIMaskSoftnessY;
               float _HexLineSize;
               float _HexZoom;

               float _Angle;
               float _LineStrength;
               float _LineEdge;
               float _LineOffset;
               float _LineSpeed;
               fixed4 _LineColor;

               float HexDist(fixed2 p)
               {
                   p = abs(p);
                   float c = dot(p, normalize(fixed2(1, 1.73)));
                   c = max(c, p.x);
                   return c;
               }

               fixed4 HexCoords(fixed2 uv)
               {
                   const fixed2 r = fixed2(1, 1.73);
                   const fixed2 h = r * .5;
                   fixed2 a = fmod(uv, r) - h;
                   fixed2 b = fmod(uv - h, r) - h;  
                   fixed2 gv = dot(a, a) < dot(b, b) ? a : b;
                   float x = atan2(gv.x, gv.y);
                   float y = .5 - HexDist(gv);
                   fixed2 id = uv - gv;
                   return fixed4(x, y, id.x, id.y);
               }

               v2f vert(appdata_t v)
               {
                   v2f OUT;
                   UNITY_SETUP_INSTANCE_ID(v);
                   UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
                   float4 vPosition = UnityObjectToClipPos(v.vertex);
                   OUT.worldPosition = v.vertex;
                   OUT.vertex = vPosition;

                   float2 pixelSize = vPosition.w;
                   pixelSize /= float2(1, 1) * abs(mul((float2x2) UNITY_MATRIX_P, _ScreenParams.xy));

                   float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
                   float2 maskUV = (v.vertex.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
                   OUT.texcoord = TRANSFORM_TEX(v.texcoord.xy, _MainTex);
                   OUT.mask = float4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));

                   OUT.color = v.color;

                   //计算屏幕坐标
                   fixed4 vpos = ComputeScreenPos(OUT.vertex);
                   OUT.viewTexcoord = vpos.xy / vpos.w;
                   OUT.viewTexcoord.x *= aspec;
                   OUT.viewTexcoord += 0.5;
                   return OUT;
               }

               fixed4 frag(v2f IN) : SV_Target
               {
                   const half alphaPrecision = half(0xff);
                   const half invAlphaPrecision = half(1.0 / alphaPrecision);
                   IN.color.a = round(IN.color.a * alphaPrecision) * invAlphaPrecision;

                   //获取屏幕坐标 计算六边形像素
                   float2 uv1 = IN.viewTexcoord + float2(0, sin(IN.viewTexcoord.x * 5. + _Time.y) * 0.01);
                   half4 hex = smoothstep(_HexLineSize, .0, HexCoords(uv1 * _HexZoom).y) * IN.color.a;

                   //旋转屏幕坐标计算流光像素
                   float2 uv2 =   mul(rot,IN.viewTexcoord.xy);
                   uv2.x +=  _Time.y * _LineSpeed;
                   uv2.x = frac(uv2.x);
                   float d = smoothstep(_LineOffset,_LineOffset + _LineEdge,uv2.x) * smoothstep(_LineOffset + _LineStrength,_LineOffset + _LineStrength - _LineEdge,uv2.x);

                   //通过lerp函数进行差值融合 再与原始图像进行叠加
                   half4 color = lerp( IN.color * hex , hex  * _LineColor,d)+ tex2D(_MainTex, IN.texcoord);

#ifdef UNITY_UI_CLIP_RECT
                   half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
                   color.a *= m.x * m.y;
#endif

#ifdef UNITY_UI_ALPHACLIP
                   clip (color.a - 0.001);
#endif
                   color.rgb *= color.a;
                   return color;
               }
        ENDCG
        }
    }
}

 文章来源地址https://www.toymoban.com/news/detail-675325.html

到了这里,关于Unity UI.Image 六边形+流光 Shader的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DDD架构为什么应该首选六边形架构?

    分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。 分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合;另一种是松散分层架构,允许任意上方层与任意下方层发生耦合。 下图是一个典型的DDD传统分层架构。 以上分层架构

    2024年02月16日
    浏览(52)
  • ❤️创意网页:如何创建一个漂亮的3D正六边形

    ✨ 博主: 命运之光   🌸 专栏: Python星辰秘典 🐳 专栏: web开发(简单好用又好看) ❤️ 专栏: Java经典程序设计 ☀️ 博主的其他文章: 点击进入博主的主页 前言: 欢迎踏入我的Web项目专栏,一段神奇而令人陶醉的数字世界! 🌌 在这里,我将带您穿越时空,揭开属于

    2024年02月16日
    浏览(48)
  • 数据分析系统中的六边形战士——奥威BI系统

    数据分析软件可以对收集的数据进行分析和报告,帮助企业获得更深入的数据洞察力,从而推动企业数字化运营决策,提高决策效率与质量。进入大数据时代,企业对数据分析软件的要求也在水涨船高,传统的数据分析软件显然已不能满足企业大数据智能可视化分析的精细化

    2024年02月16日
    浏览(35)
  • 从混乱到优雅:基于DDD的六边形架构的代码翻新指南

    趁着双十一备战封板,终于又有一些时间可以梳理一下最近的心得。 最近这半年跟同事讨论比较多的是分层架构,然后就会遇到两个触及灵魂的问题,一个是如何做好分层架构,二是DDD在架构层面该如何落地。 为了说好分层,我们需要了解架构的意义。 良好的架构是为了保

    2024年02月05日
    浏览(53)
  • QT使用QImage制作图片的四种(圆形,六边形,复古与负片)效果(测试过效果的代码)

    负片效果: 复古效果:   裁剪成圆形   裁剪成六边形:  

    2024年02月13日
    浏览(39)
  • Unity中Shader实现UI流光效果

    在很多游戏的 UI 中,都有实现 一道光扫过 UI 的效果 Unity中Shader的时间_Time 注意: 因为,这是UGUI的Shader,记着修改渲染顺序为 透明层级 和 混合模式 Tags {“Queue” = “TransParent”} Blend SrcAlpha OneMinusSrcAlpha 代码: 效果: Unity3D Shader系列之UI流光效果 Unity流光shader,无需图片

    2024年02月05日
    浏览(49)
  • Unity之ASE实现UI流光效果

    之前我们做过UV流动的效果,今天我们来做一个用于UI界面的特效–UI流光效果,先看下效果如下: 1.创建一个Legacy/Default UI的Shader,这是专门用于UI的shader模板 2.添加一个Templete Parameter节点,作为Image的Sprite Texture贴图 3.然后我们把Sprite Texture输出给一个Texture Sample节点 如下所示

    2023年04月21日
    浏览(42)
  • Unity3d 图片Image置灰shader

    置灰公式:    value=color.r x 0.299 +color.g x 0.587 + color.b * 0.114 color.rgb = lerp(color.rgb, Luminance(color.rgb), _Factor); 或 color.rgb = dot(color.rgb, fixed3(0.299, 0.587, 0.114));

    2024年02月11日
    浏览(46)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包