Unity Shader 流光 边缘光

news2024/10/6 1:37:45

前言

Unity2021.3.23

一、实现原理

Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。

二、效果及源码展示

1.流光效果

效果描述:
1.边缘光(菲尼尔),
2.从上到下扫描光.

效果图如下:

代码如下:

Shader "Unlit/ScanCode"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _RimMin("RimMin",Range(-1,1)) = 0.0
        _RimMax("RimMax",Range(0,2)) = 1.0
        _InnerColor("InnerColor",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 { "RenderType"="Opaque" }
       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
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                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;
            float4 _RimIntensity;
            float4 _FlowTilling;
            float4 _FlowSpeed;
            sampler2D _FlowTex;
            float _FlowIntensity;
            float _InnerAlpha;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                //float4(v.normal,0.0)如果是向量,后面补0.0
                float3 normal_world = mul(float4(v.normal,0.0), unity_WorldToObject);
                float3 pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.normal_world = normalize(normal_world);
                o.pos_world = pos_world;
                //三维向量变成一个四维向量,后面补1.0,
                o.pivot_world = mul(unity_ObjectToWorld,float4(0.0, 0.0, 0.0, 1.0));
                o.uv = v.texcoord;            
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //1.边缘光
               half3 normal_world = normalize(i.normal_world);
               //视线方向的向量,先拿到世界空间上的摄像机的位置,然后归一化。
               //精度上,向量用half3就够了。片元阶段要非常注意性能
               half3 view_world = normalize(_WorldSpaceCameraPos.xyz -i.pos_world);
               //限制在0-1的范围内 
                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;



                //2.流光
                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位置,达到从上到下的扫描效果.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

必看——通配符SSL证书在线免费申请方法!

申请通配符SSL证书,就相当于给你的网站及所有子域名都戴上同一顶加密“帽子”,保护它们的安全通信。以下是三步搞定的方法: 第一步:找权威机构 就像你要找个官方认证的地方办证明一样,先选一家靠谱的证书颁发机构&…

软考中级网络工程师-2024上岸宝典

1.软考是什么 简单说就是计算机技术 相关的国家级证书考试,想听专业点给大家截一张官网的图,不想听废话直接往下。 同为国家级证书的:注册会计师、法律职业资格证、一级建筑师,证书的价值是比较高的。 很多人都是在求职前或者大…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备,实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息,为了保障车辆及运输人员 的安全,应合理选择摄录设…

探索半导体测试领域:哲讯TCC智能化管理系统的应用与优势

在半导体行业中,封装和测试环节是至关重要的一环。半导体封装测试是指将通过测试的晶圆按照产品型号及功能需求加工得到独立芯片的过程。半导体封测包括封装和测试两个环节,封装是保护芯片免受物理、化学等环境因素造成的损伤,增强芯片的散热…

node.js-模块化

定义:CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中,每个文件都被视为一个单独的模块。 概念:项目是由很多个模块文件组成的 好处&#xff1a…

一文读懂电阻并联电路和串联电路的特性

电阻并联电路是最基本的并联电路,所有的电路都可以转化为电阻串联电路和电阻并联电路来了解其工作原理。并联电路和串联电路具有完全不同的特性。它们是完全不同的电路,不能相互等效(电阻并联电路图)。 串联电路 特点与特性&…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器,想要高效的用好ChatGPT,首先,让我们从如何与它进行有效的对话开始。要知道,ChatGPT并非简单的问答机器,而是一个可以通过交互学习和适应的智能体。那么,如何让ChatGPT来更好地理解我们…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下,社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok,这款全球热门的短视频应用,已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言,借助云手机运营TikTok,能够解锁更多潜在可能&#xff0…

短视频素材哪个网站好?8个视频素材下载免费网站

在视频制作的宏大舞台上,寻找恰到好处的素材是每位创作者的日常挑战。高清、无水印的视频素材不仅能够让你的作品焕发光彩,还能在讲述故事时增添无限动力。除了蛙学府,这里汇集了世界各地的视频素材网站,每个都带有独特的魅力&…

数据结构(七)——散列表

7.5.1 散列表的基本概念 散列表(哈希表,Hash Table)︰是一种数据结构。特点是∶可以根据数据元素的关键字计算出它在散列表中的存储地址 散列函数(哈希函数)︰AddrH(key)建立了“关键字”→“存储地址”的映射关系 冲突(碰撞)︰在…

【Linux】地址空间虚拟地址

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 虚拟地址1.1 虚拟地址引入1.2 虚拟地址理解1.3 虚拟地址细节问题 2. 地址空间2.1 理解地址空间2.2 页表和写时拷贝 3. 进程调度 1. 虚拟地址 1.1 虚拟地址引入 先先来一个测试代码&#xff1a; 1 #include<st…

JMM与内存屏障

一、cpu多核并发缓存架构解析 JMM内存模型&#xff1a;java多线程内存模型跟cpu缓存模型类似&#xff0c;是基于cpu缓存模型来建立的&#xff0c;java线程内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别 JMM数据原子操作 read(读取)&#xff1a;从主内存读取数据…

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入&#xff08;DI&#xff09;容器支持三种服务的生命周期选项&#xff0c;它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要&#xff1a; 瞬时&#xff08;Transient&#xff09;&#xff1a; 瞬时服务每次…

【Flutter】GetX状态管理及路由管理用法

目录 一、安装二、使用1.安装GetX插件&#xff0c;快捷生成模版代码2.主入口MaterialApp改成GetMaterialApp3.定义路由常量RoutePath类、别名映射页面RoutePages类4. 初始initialRoute&#xff0c;getPages。5.调用 总结 一、安装 dependencies: get: ^4.6.6二、使用 1.安装G…

vue和react通用后台管理系统权限控制方案

1. 介绍 在任何企业级应用中&#xff0c;尤其是后台管理系统&#xff0c;权限控制是一个至关重要的环节。它确保了系统资源的安全性&#xff0c;防止非法访问和操作&#xff0c;保障业务流程的正常进行。本文件将详细解析后台管理系统中的权限控制机制及其实施策略。 那么权限…

Vue-鼠标悬浮在缩略图图片上,弹出原图

使用Popover 弹出框实现 <template><div><el-popoverplacement"right"width"400"trigger"hover"><img src"https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x36…

第九、十章 异常、模块、包以及数据可视化

第九章 异常、模块、包 异常 捕获异常 捕获常规异常 # 捕获常规异常 try:f open("D:/abc.txt", "r", encoding "UTF-8") except:print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开&qu…

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…

遥瞻智慧:排水系统远程监控的卓越解决方案

遥瞻智慧&#xff1a;排水系统远程监控的卓越解决方案 在城市脉络的深层肌理中&#xff0c;排水系统犹如一条条隐秘的生命线&#xff0c;默默承载着城市的呼吸与律动。然而&#xff0c;如何以科技之眼&#xff0c;赋予这些无形网络以实时感知、精准调控的能力&#xff0c;使之…