UnityShader——流光效果

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

声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。


UnityShader学习目录



前言

Unity2019.3.6
AmplifyShaderEditor


一、实现原理

Time控制UV的变化,再采样一张流光贴图.即可实现流光效果.下列包含两个流光效果及源码作为学习参考.

二、效果及源码展示

1.流光效果

效果描述:
1.边缘光(菲尼尔),
2.从上到下扫描光.
效果图如下:
unity流光效果,Unity Shader,unity,shader

AmplifyShaderEditor节点图如下:
unity流光效果,Unity Shader,unity,shader
参数设置如下:
unity流光效果,Unity Shader,unity,shader
代码如下:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Unlit/Scan_Code01"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_RimMin("RimMin",Range(-1,1)) = 0.0
		_RimMax("RimMax",Range(0,2)) = 1.0
		_InnerColor("Inner Color",Color) = (0.0,0.0,0.0,0.0)
		_RimColor("Rim Color",Color) = (1,1,1,1)
		_RimIntensity("Rim Intensity",Float) = 1.0
		_FlowTilling("Flow Tilling",Vector) = (1,1,0,0)
		_FlowSpeed("Flow Speed",Vector) = (1,1,0,0)
		_FlowTex("Flow Tex",2D) = "white"{}
		_FlowIntensity("Flow Intensity",Float) = 0.5
		_InnerAlpha("Inner Alpha",Range(0.0,1.0)) = 0.0
	}
	SubShader
	{
		Tags { "Queue"="Transparent" }
		LOD 100

		Pass
		{
			ZWrite Off
			Blend SrcAlpha One
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
				float3 normal : NORMAL;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float3 pos_world : TEXCOORD1;
				float3 normal_world : TEXCOORD2;
				float3 pivot_world : TEXCOORD3;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _RimMin;
			float _RimMax;
			float4 _InnerColor;
			float4 _RimColor;
			float _RimIntensity;
			float4 _FlowTilling;
			float4 _FlowSpeed;
			sampler2D _FlowTex;
			float _FlowIntensity;
			float _InnerAlpha;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				float3 normal_world = mul(float4(v.normal, 0.0), unity_WorldToObject).xyz;
				float3 pos_world = mul(unity_ObjectToWorld, v.vertex).xyz;
				o.normal_world = normalize(normal_world);
				o.pos_world = pos_world;
				o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;
				o.uv = v.texcoord;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				half3 normal_world = normalize(i.normal_world);
				half3 view_world = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
				
				//
				half NdotV = saturate(dot(normal_world, view_world));
				half fresnel = 1.0 - NdotV;
				fresnel = smoothstep(_RimMin, _RimMax, fresnel);
				half emiss = tex2D(_MainTex, i.uv).r;
				emiss = pow(emiss, 5.0);

				half final_fresnel = saturate(fresnel + emiss);

				half3 final_rim_color = lerp(_InnerColor.xyz, _RimColor.xyz * _RimIntensity, final_fresnel);
				half final_rim_alpha = final_fresnel;
				//流光
				half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
				uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
				float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;

				float3 final_col = final_rim_color + flow_rgba.xyz;
				float final_alpha = saturate(final_rim_alpha + flow_rgba.a + _InnerAlpha);
				return float4(final_col, final_alpha);
			}
			ENDCG
		}
	}
}

(i.pos_world.xy - i.pivot_world.xy)
用于计算UV位置,达到从上到下的扫描效果.

2.流光效果二

效果描述:
1.中间遮罩剔除
2.扭曲
3.颜色叠加

效果图如下:
unity流光效果,Unity Shader,unity,shader
代码如下:

Shader "Unlit/Scan_Code02"
{
    Properties
    {
        [Header(RenderingMode)]
        [Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("SrcBlend" ,int   )=0
        [Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("DstBlend",int)=0
        [Enum(UnityEngine.Rendering.CullMode)]_Cull("Cull",int)=0

        [Header(Base)]
        _MainTex ("Texture", 2D) = "white" {}
        _Color("Color",color)=(1,1,1,1)
        _Instensity("Instensity",float)=0.5
        _MainUVSpeedX("MainUVSpeed X",float)=1
        _MainUVSpeedY("MainUVSpeed Y",float)=1

        [Header(Mask)]
        [Toggle]_MASKENABLED("Mask Enable",int)=0
         _MaskTex("MaskTex",2D)="white"{}
        _MaskUVSpeedX("MaskUVSpeed X",float)=0
        _MaskUVSpeedY("MaskUVSpeed Y",float)=0

        [Header(Distort)]
        [MaterialToggle(DISTORTENABLED)]_DISTORTENABLED_ON("Distort Enable",int)=0
        _DistortTex("DistortTex",2d)="white"{}
        _Distort("Distort",Range(0,1))=0
        _DistortUVSpeedX("DistortUVSpeed X",float)=0
        _DistortUVSpeedY("DistortUVSpeed Y",float)=0
    }
    SubShader
    {
        Blend [_SrcBlend][_DstBlend]
        Tags { "Queue"="Transparent" }       
        Cull [_Cull]
        Pass
        {            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           
            #pragma shader_feature _ _MASKENABLED_ON
            #pragma shader_feature _ DISTORTENABLED
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;            
                float4 vertex : SV_POSITION;
                float2 uv2:TEXCOORD1;
            };  

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            half _Instensity;
            float _MainUVSpeedX,_MainUVSpeedY;
            sampler2D _MaskTex;
            float4 _MaskTex_ST;//Mask贴图的UV元素
            float _MaskUVSpeedX,_MaskUVSpeedY;//控制MaskUV的变量
            sampler2D _DistortTex;
            float4 _DistortTex_ST;
            float _Distort;
            float _DistortUVSpeedX,_DistortUVSpeedY;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv.xy=v.uv*_MainTex_ST.xy+_MainTex_ST.zw+float2(_MainUVSpeedX,_MainUVSpeedY)*_Time.y;//主贴图UV流动
                // o.uv = TRANSFORM_TEX(v.uv, _MainTex)+float2(_MainUVSpeedX,_MainUVSpeedY)*_Time.y;            
                #if _MASKENABLED_ON
                    o.uv.zw=TRANSFORM_TEX(v.uv,_MaskTex)+float2(_MaskUVSpeedX,_MaskUVSpeedY)*_Time.y;//Mask贴图UV流动
                #endif

                #if DISTORTENABLED
                o.uv2=TRANSFORM_TEX(v.uv,_DistortTex)+float2(_DistortUVSpeedX,_DistortUVSpeedY)*_Time.y;
                #endif
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 distort=i.uv.xy;
                
                #if DISTORTENABLED
                    fixed4 distortTex=tex2D(_DistortTex,i.uv2);
                    distort=lerp(i.uv.xy,distortTex,_Distort);
                #endif

                fixed4 c = tex2D(_MainTex, distort);  
                c*=_Color*_Instensity;     

                #if  _MASKENABLED_ON
                    fixed4 maskTex=tex2D(_MaskTex,i.uv.zw); 
                    c*=maskTex;               
                #endif  
                return c;
            }
            ENDCG
        }
    }
}

参数设置如下:
unity流光效果,Unity Shader,unity,shader

总结

保持饥饿,保持愚蠢.

这世界唯一能够相信的就是你付出的努力和你走过的路.文章来源地址https://www.toymoban.com/news/detail-569295.html

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

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

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

相关文章

  • Unity Shader学习3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值为0是完全透明,为1时完全不透明。有两种方法可以实现透明效果: 透明度测试(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度测试是指通过特定的条件(通常是Alpha通道的值是否超过某个阈值)来判断片元是否透明,只

    2024年01月19日
    浏览(59)
  • 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    《入门精要》中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是 GrabPass ,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabPass及实现原理做一个更加详细的介绍。 场景物体拜访和贴图完全参考《入门精要》: 以及当前场景

    2024年02月09日
    浏览(46)
  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(47)
  • Unity用Shader实现边缘光效果

    《自学记录》 1、先创建一个Cube,再创建两个材质球Cube、Unilt 2、再创建一个shader代码UniltShader【Project右键Create-Shader-NewSurfaceShader】把里面原来的代码删除,写入下面的代码 3、把shader UniltShader拖给材质球Unilt 4、把Cube的Mesh Renderer中Materials的Size改为2,然后把材质球Cube、Unilt分

    2024年02月08日
    浏览(44)
  • 学习100个Unity Shader (14) ---透明效果

    由”Queue“ 标签决定,索引号越小越早被渲染: 名称 队列索引号 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。 UnityObjectToClipPos 将顶

    2024年04月29日
    浏览(43)
  • 【unity shader】水体渲染基础-水下透视效果

    接下来是水体渲染基础的最后一篇,通过水面看到水下的物体,并呈现深度效果。 我们直接搭一个小场景。 增加水面,赋予uv变形的水面材质,并增加透明度的设置。 水体会吸收光线,所以真实的水体并不是完全透明的。此外,水体对不同频率的光吸收率不同,蓝光被吸收

    2024年03月14日
    浏览(53)
  • Unity Shader入门精要 第八章——透明效果

    目录 前言 一、渲染顺序的重要性 二、Unity Shader的渲染顺序 三、透明度测试 1、什么是透明度测试 2、实践 四、透明度混合 1、什么是透明度混合 2、实践  五、开启深度写入的半透明效果 1、实现方法  2、实践 六、ShaderLab的混合命令 1、混合等式和参数 2、混合操作  3、常见

    2024年02月04日
    浏览(42)
  • 【unity shader案例】如何实现一个玻璃效果

      原理:玻璃最大的特点当然就是半透明了,如何在游戏中实现这样的效果呢?我这里总体的思路就是先截取整个场景作为一张纹理,然后把玻璃区域的纹理贴到这个玻璃模型上。 下面看具体实现代码 实现效果如下    更进一步,还可以实现毛玻璃的效果,思路就是用一张

    2024年02月16日
    浏览(48)
  • 【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年02月16日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包