Unity制作护盾——1、闪电护盾

news2024/11/24 9:56:18

Unity引擎制作闪电护盾效果

  大家好,我是阿赵。
  这期做一个闪电护盾的效果。

一、效果说明

在这里插入图片描述
在这里插入图片描述

可以改变闪电的颜色
在这里插入图片描述

可以改变范围
在这里插入图片描述
在这里插入图片描述

改变贴图的平铺次数,也可以做出各种不同感觉的护盾。

二、原理

这个效果看着很复杂,其实只是用了一张Noise贴图
在这里插入图片描述

在这里插入图片描述

把贴图贴在一个球上,得到这样的效果
在这里插入图片描述

常规操作,先乘再power,得到一个可以控制亮度和范围的效果。

  这里我想这个效果是流动起来的。所以可以选择用UV动画来做。我这里做一个稍微复杂一点的UV动画,叫做Flow效果:

float3 Flow(sampler2D tex, float2 uv, float2 dir, float2 strength, float speed)
{
	float2 dirx = dir + 0.5f;
	float timeSpeed = _Time.y*speed;
	float2 uv1 = uv + (dirx*strength*frac(timeSpeed));
	float2 uv2 = uv + (dirx*strength*(frac(timeSpeed + 0.5f)));
	float3 result = lerp(UnpackNormal(tex2D(tex, uv1)), UnpackNormal(tex2D(tex, uv2)), (abs((frac(timeSpeed) - 0.5)) / 0.5));
	return result;
}

通过传入贴图、uv、流动方向、流动强度和速度,得到一个流动的动画效果。
在这里插入图片描述

  对上面的效果继续做power和取反(被1减)的操作,得到这样的一个效果,我们拿到的是刚才那个噪声图的边缘。
在这里插入图片描述

  接下来我们再做一次Flow,但这次传入的dir是不同的。然后把两次的结果相乘,得到这么一个随机变化的遮罩。
在这里插入图片描述

给rgb乘以一个颜色,就得到了这个护盾的基础颜色了
在这里插入图片描述

  然后把遮罩给到alpha通道,就看到了这样的效果了。
  如果想闪电有一定的闪烁效果,那么简单的用Time作为x,0作为y,组成UV采样一下给噪声图。就能得到一个闪烁的过程,这个值乘以原来的Alpah通道。

三、代码

Shader "azhao/azhaoShield1"
{
    Properties
    {
		_Size("Size", Range(0 , 10)) = 1
		_colorPow("colorPow", Float) = 1
		_colorMul("colorMul", Float) = 1
		_mainColor("mainColor", Color) = (1,1,1,0)
		_Noise1Tex("Noise1Tex", 2D) = "white" {}
		_dir1("dir1", Vector) = (0,0,0,0)
		_dir2("dir2", Vector) = (1,1,0,0)
		_alphaSpeed("alphaSpeed", Float) = 1
		_colorAdd("colorAdd", Float) = 1
		_flowSpeed("flowSpeed", Float) = 1
		_flowStrength("flowStrength", Vector) = (1,1,0,0)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
		Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha
		ZWrite Off
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

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

			uniform float4 _mainColor;
			uniform sampler2D _Noise1Tex;
			uniform float4 _Noise1Tex_ST;
			uniform float _Size;
			uniform float3 _dir1;
			uniform float2 _flowStrength;
			uniform float _flowSpeed;
			uniform float _colorMul;
			uniform float _colorPow;
			uniform float3 _dir2;
			uniform float _colorAdd;
			uniform float _alphaSpeed;

			float3 Flow(sampler2D tex, float2 uv, float2 dir, float2 strength, float speed)
			{
				float2 dirx = dir + 0.5f;
				float timeSpeed = _Time.y*speed;
				float2 uv1 = uv + (dirx*strength*frac(timeSpeed));
				float2 uv2 = uv + (dirx*strength*(frac(timeSpeed + 0.5f)));
				float3 result = lerp(UnpackNormal(tex2D(tex, uv1)), UnpackNormal(tex2D(tex, uv2)), (abs((frac(timeSpeed) - 0.5)) / 0.5));
				return result;
			}

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _Noise1Tex)/+_Size;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
				float3 col1 = Flow(_Noise1Tex,i.uv,_dir1,_flowStrength,_flowSpeed);
				float3 col2 = Flow(_Noise1Tex, i.uv, _dir2, _flowStrength, _flowSpeed);
				float val1 = 1.0 - saturate( pow(col1.r*_colorMul, _colorPow));
				float val2 = 1.0 - saturate(pow(col2.r*_colorMul, _colorPow));
				float4 noiseCol = tex2D(_Noise1Tex, float2(frac(_Time.y*_alphaSpeed), 0));
				float alpha = val1*val2*noiseCol.r*noiseCol.r;
				float3 rgb = _mainColor.rgb*val1*val2*_colorAdd;
                return half4(rgb,alpha);
            }
            ENDCG
        }
    }
}

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

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

相关文章

我们来谈谈数据链路层

"啊,其实触手可及!" 谈到网络层IP,有很多说法都是说,"IP是决定到达对端主机的能力"。而在实际的网络世界中,在各个节点路由器上,游走的报文也是IP报文! 但是&#xff0c…

C++入门之stl六大组件--List源码深度剖析及模拟实现

文章目录 前言 一、List源码阅读 二、List常用接口模拟实现 1.定义一个list节点 2.实现一个迭代器 2.2const迭代器 3.定义一个链表,以及实现链表的常用接口 三、List和Vector 总结 前言 本文中出现的模拟实现经过本地vs测试无误,文件已上传gite…

AI大模型来袭,智能客服变天?

配图来自Canva可画 自ChatGPT爆火“出圈”之后,国内外就掀起了一波AI大模型风潮。越来越多的企业都开始布局AI大模型领域,其中不少企业已经推出了自家的AI大模型产品,试图在这股AI浪潮中拔得头筹。而在众多AI大模型中,既有通用大…

Python爬虫如何更换ip防封

作为一名长期扎根在爬虫行业动态ip解决方案的技术员,我发现很多人常常在使用Python爬虫时遇到一个困扰,那就是如何更换IP地址。别担心,今天我就来教你如何在Python爬虫中更换IP,让你的爬虫不再受到IP封锁的困扰。废话不多说&#…

LVS负载均衡(DR)

文章目录 LVS-DR模式配置原理注DR配置添加VIP下载ipvsadm在DR上管理LVS Real-Server RS配置绑定VIP到环回网卡添加访问VIP的路由配置ARP抑制测试: LVS-DR模式配置 原理 当客户端发起请求后由DR处理,通过算法将流量转发至Real-Server中的某一个处理。然后…

8.16CAS

1.CAS 2. 原子类的原理 3.原子类的使用 import java.util.concurrent.atomic.AtomicInteger;public class Test {public static AtomicInteger atomicInteger new AtomicInteger();public static void main(String[] args) throws InterruptedException {System.out.println(…

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台 1. 效果图2. 命令行:proto文件转.class(绝对路径或相对路径)3. 序列化、反序列化api4. pb转json&a…

搭建MyBatis开发环境

hi,大家好,今天来学习一下MyBatis的相关知识 文章目录 🧊1.MyBatis定义🧊2.为什么要学习MyBatis🧊3.搭建MyBatis开发环境🍐3.1前置工作--创建数据库和表🍐3.2在新项目中添加MyBatis的框架🍐3.3设置MyBatis…

Leetcode31 下一个排列

解题思路: 算法过程的第二步,可以变为将[j,end]排序,然后从[j,end)和i进行比较,在区间j,end区间第一个大于nums[i]后,交换即可 public void nextPermutation(int[] nums) {int len nums.length - 1;for(int i len;i…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去,在app.json里面配置 在你需要的 页面的 json里面配置,按需引入 然后看文档,再在你的 wxml里面使用就好了

使用DMA传输实现单片机高效串口转发——以STM32系列为例

使用DMA传输实现单片机高效串口转发——以STM32系列为例 DateAuthorVersionNote2023.08.06Dog TaoV1.01. 完成了文档的撰写。 文章目录 使用DMA传输实现单片机高效串口转发——以STM32系列为例应用场景实现流程源码示例串口与中断配置DMA外设配置DMA发送数据函数串口中断服务函…

Java中String方法魔性学习

这里写目录标题 先进行专栏介绍String详解常用构造方法代码演示常用成员方法代码示例总结 先进行专栏介绍 本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望…

【redis】SpringBoot集成redis

目录 1.添加redis依赖2.配置redis3.操作redis3.1 操作string 3.1 操作其它数据类型 4. Spring-Session基于Redis解决共享Session问题4.1 问题提出 4.1 添加依赖 4.2 修改配置4.3 存储和读取 1.添加redis依赖 方法①&#xff1a; <dependency><groupId>org.springf…

ChatGPT已闯入学术界,Elsevier推出AI工具

2022年11月&#xff0c;OpenAI公司发布了ChatGPT&#xff0c;这是迄今为止人工智能在现实世界中最重要的应用之一。 当前&#xff0c;互联网搜索引擎中出现了越来越多的人工智能&#xff08;AI&#xff09;聊天机器人&#xff0c;例如谷歌的Bard和微软的Bing&#xff0c;看起来…

微信小游戏流量主结算财务信息填写指引

微信小游戏个人开发者: 流量主结算财务信息填写指南 一,登录公众平台二,补充财务信息三,补充信息指引四,提交审核五,绑定通知对于微信小游戏个人开发者来说,流量主结算财务信息的填写是非常重要的一步。正确填写可以保证收入的及时结算,而填写不当则可能会导致收入无法到…

wxRibbonBar 常用三种控件Button,DropdownButton,HybridButton

这三种控件的效果如下所示&#xff1a; 点击下拉的效果&#xff1a; 这一部分可以设置wxITEM_CHECK&#xff0c;wxITEM_RADIO等效果 但我们可能更关注实现实例&#xff1a; &#xff08;1&#xff09;MyFrame.h #pragma once #include <wx/wx.h> #include "wx/wx…

vue2-diff算法

1、diff算法是什么&#xff1f; diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点&#xff1a; 比较只会在同层级进行&#xff0c;不会跨层级进行。 在diff比较的过程中&#xff0c;循环从两边向中间比较。 diff算法在很多场景中都有应用&#xff0c;在vue中&…

(学习笔记-进程管理)进程

进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着CPU会执行程序中的每一条指令&#xff0c;那么这个运行中的程序就被称为进程。 现在我…

怎么加密文件夹才更安全?安全文件夹加密软件推荐

文件夹加密可以让其中数据更加安全&#xff0c;但并非所有加密方式都能够提高极高的安全强度。那么&#xff0c;怎么加密文件夹才更安全呢&#xff1f;下面我们就来了解一下那些安全的文件夹加密软件。 文件夹加密超级大师 如果要评选最安全的文件夹加密软件&#xff0c;那么文…

python GUI nicegui初识一(登录界面创建)

最近尝试了python的nicegui库&#xff0c;虽然可能也有一些不足&#xff0c;但个人感觉对于想要开发不过对ui设计感到很麻烦的人来说是很友好的了&#xff0c;毕竟nicegui可以利用TailwindCSS和Quasar进行ui开发&#xff0c;并且也支持定制自己的css样式。 这里记录一下自己利…