Unity Shader:闪烁

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

unity 物体闪烁,U3D,shader,unity,游戏引擎,shader

还是一样的分为UI闪烁和物体闪烁,其中具体可分为:UI闪烁、物体闪烁与半透明闪烁

1,UI闪烁

对于UI 还是一样的,改写UI本身的shader:

Shader "UI/YydUIShanShder"
{
	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
	
	    [Toggle]_Switch("Switch", Float) = 0

		_value("Speed",Range(1,3)) = 1
		_overlayCol("OtherColor",Color) = (0.2146,1,0,0.6039)
	
	}

		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 SrcAlpha 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

		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;
		half4  mask : TEXCOORD2;
		UNITY_VERTEX_OUTPUT_STEREO
	};

	sampler2D _MainTex;
	fixed4 _Color;
	fixed4 _TextureSampleAdd;
	float4 _ClipRect;
	float4 _MainTex_ST;
	float _UIMaskSoftnessX;
	float _UIMaskSoftnessY;


	float _value;
	float4 _overlayCol;

	half _Switch;


	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 = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));

		OUT.color = v.color * _Color;
		return OUT;
	}

	fixed4 frag(v2f IN) : SV_Target
	{
		half4 color = IN.color * (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);

#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
		half _g = dot(color.rgb, unity_ColorSpaceLuminance);

		//这部分是自定义处理的
		if (_Switch == 1)
		{
			fixed4 col = _overlayCol;
			float t = abs(sin(_Time.w * _value));
			col.a = lerp(0, _overlayCol.a, t);

			color = lerp(color, col, col.a);//将col叠加在color上
		}

		return color;
	}
		ENDCG
	}
	}
}

  实现原理我们可以理解为,在原有的图片上,叠加了一层会随着时间变化而变化透明度的纯色。

  和原image的shader相比,基本没做太大改动。只是为了实现闪烁效果,自定义了如下部分:

//这部分是自定义处理的
		if (_Switch == 1)
		{
			fixed4 col = _overlayCol;
			float t = abs(sin(_Time.w * _value));
			col.a = lerp(0, _overlayCol.a, t);

			color = lerp(color, col, col.a);//将col叠加在color上
		}

2,物体闪烁

unity 物体闪烁,U3D,shader,unity,游戏引擎,shader

  原理相同,实现代码如下:

Shader "YaDong/YydShanShader"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}

        [Header(twinkle)]
        _twinkleCol("闪光色",Color) = (0.7735,0.7735,0.7735,1)
        _twinkleValue("闪烁 Speed",float) = 1


       _middleValue("中间值",float) = 0.5
       _volatilityValue("波动",float) = 0.6
     
    }
        SubShader
        {
            Tags { "RenderType" = "Opaque" }
            LOD 100

            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                // make fog work
                //#pragma multi_compile_fog

                #include "UnityCG.cginc"

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

                struct v2f
                {
                    float2 uv : TEXCOORD0;
                    //UNITY_FOG_COORDS(1)
                    float4 vertex : SV_POSITION;
                };

                sampler2D _MainTex, _YydChangeInterval;
                float4 _MainTex_ST;

                float4 _twinkleCol;
                float _twinkleValue;

                float _middleValue;
                float _volatilityValue;

                v2f vert(appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    // UNITY_TRANSFER_FOG(o,o.vertex);
                     return o;
                 }

                 fixed4 frag(v2f i) : SV_Target
                 {
                     // sample the texture
                     fixed4 col = tex2D(_MainTex, i.uv);

                     float t = abs(sin(_Time.w * _twinkleValue)* _volatilityValue)+ _middleValue;// +0.5;
                     col.rgb = lerp(col.rgb, saturate(col.rgb + _twinkleCol.rgb), t);

                     return col;
                 }
                 ENDCG
             }
        }
}

3,纯色半透明闪烁

unity 物体闪烁,U3D,shader,unity,游戏引擎,shader

  与上述物体闪烁不同的是,这个只是在颜色基础上加了半透明闪烁,实现代码如下:文章来源地址https://www.toymoban.com/news/detail-736129.html

Shader "YaDong/YydGreenShader"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _value("速度",Range(1,3)) = 1
        _overlayCol("叠加色",Color) = (0.2146,1,0,0.6039)
    }
        SubShader
    {
        //Tags { "RenderType" = "Opaque"  }
        Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
        zWrite off
        blend srcAlpha one
        //LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            //#pragma multi_compile_fog

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                //UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex, _YydChangeInterval;
            float4 _MainTex_ST;
          
            float _value;
            float4 _overlayCol;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                // UNITY_TRANSFER_FOG(o,o.vertex);
                 return o;
             }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 col = _overlayCol;
                float t = abs(sin(_Time.w * _value));
                col.a = lerp(0.3, _overlayCol.a, t);
                
                return col;
             }
             ENDCG
         }
    }
}

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

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

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

相关文章

  • Unity骚操作:更改u3d导出apk时候所使用的 gradle、GradleTemplates、VisualStudioGradleTemplates、minifyEnabled是否开启混淆等

    测试unity版本:5.6.4 gradle文件夹:里面的是一些unity用自身打包apk时候用到的一些工具 GradleTemplates文件夹:    libTemplate.gradle  mainTemplate.gradle  settingsTemplate.gradle 附上让Unity自身打APK的时候 使用上镜像并且设置上 build:gradle通用工具让 需要生成AS工程的时候 可以让AS识别

    2024年02月14日
    浏览(55)
  • Unity游戏图形学 Shader结构

    openGL:SLG跨平台 =GLSL:openGL shaderlauguge DX:微软开发,性能很好,但是不能跨平台 =HLSL:high level shader language CG:微软和Nvidia公司联合开发,跨平台,基于c语言开发,性能很好 openGL、dx、cg都包含 CG和HLSL包括在 CGPROGRAM...ENDCG 语法快内 GLSL包括在 GLSLPROGRAM...ENDGLSL 语法快内 自己

    2024年02月01日
    浏览(45)
  • Shader实战(1):Unity中使物体不受光照影响(不区分明暗面)

    目录 前言 一、原场景效果 二、操作流程 三、效果演示 在做项目时碰到需要在一个有光照场景中使某一个模型不受光照影响,即不区分明暗面,因此本文记录如何修改shader使模型在有光照的情况下不区分明暗面。 一开始本人尝试将贴图设置为自发光材质,但是仔细观察发现

    2024年02月11日
    浏览(44)
  • U3D游戏角色血条制作并显示血量变化

    关键:利用Slider来制作血条 大概效果: 数字会随着血量变化而变化。 步骤 1、在层级面板中右击,选择UI中的Slider. 2、创建好后,将Slider命名为HealthBar,可以看到层级面板中Slider的结构为,删掉其中的“Handle Slide Area”. 3、在层级面板选中HealthBar,在右侧的检查器窗口可以看到

    2024年02月09日
    浏览(46)
  • 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日
    浏览(47)
  • Unity3D Shader系列之描边

    总结下描边效果的实现方式,主要有以下几种: ①法线外拓+ZTest Always ②法线外拓+Cull Front ③法线外拓+ZWrite Off ④法线外拓+模板测试 ⑤基于屏幕后处理 法线外拓的原理如下: 基本原理还是很简单的:模型渲染两次,第一次渲染时将模型的顶点沿法线方向外拓,然后绘制描边

    2023年04月08日
    浏览(49)
  • Unity3D Shader系列之深度纹理

    这篇总结下场景扫描的效果。场景扫描背后的原理其实挺简单,先获取相机的深度图,再获取相机绘制的画面,然后从深度图中取出当前像素的深度值,如果深度值在我们扫描线的深度值的范围内,那么当前像素的颜色就为扫描线的颜色与原画面颜色的叠加。所以实现这个效

    2023年04月11日
    浏览(35)
  • Unity3D打包Assetbundle丢失Shader问题

    详情见:https://www.pianshen.com/article/5391338163/ 1、Unity3D在打包Assetbundle时,可能会遇到Shader丢失的问题,解决方法:打开 Edit-Project Settings-Graphics,在Always Included Shaders列表添加上所需的shader ,再打包即可。 2、参考 3、原文复制 Scriptable RenderLoop settings This is an experimental setting wh

    2023年04月22日
    浏览(61)
  • 【实现100个unity特效】shader实现3D物品闪光和描边效果

    线状映射图片 配置,按该shader新增材质 Outline Width控制描边 Line Speed控制闪光速度 当然,还可以修改对应的颜色 效果演示 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的 点赞评论和关注 ,以便我第一时间收到反馈,你的每一次 支持 都是我不断创作的最

    2024年01月25日
    浏览(66)
  • Unity3D Shader 引导遮罩,支持圆形、矩形、圆角矩形框

    unity3D新手引导遮罩,支持圆形,矩形框,圆角矩形框。图形位置和大小可以根据控件的位置和大小调节,通用所有分辨率设备。黄色区域遮挡,只有白色区域可以点穿。 原文链接:https://www.kadastudio.cn/archives/89 ​ 将MyGuideMask挂载到脚本上,然后通过GuideMask创建材质并赋值,根据

    2024年02月11日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包