Unity Shader UVLightReveal (紫外线显示,验钞效果)

Unity Shader UVLightReveal (紫外线显示,验钞效果)

  • UVLight Reveal 实现验钞机的效果
  • 实现方案
  • 操作实现
    • 1.Light
    • 2.将另一个图形加入
    • 3.加上图形效果
    • 4.加上灯光的颜色自定义判定
  • 源码

UVLight Reveal 实现验钞机的效果

大家应该都有见过验钞机验100块钱的经历吧,而且在很多光感游戏中也会出现这种效果,当指定颜色的光线照射到对应的物体上物体就会呈现出隐藏的效果,在我理解的游戏中很多密室类型的游戏会有这种需求,况且我们把这种效果加在某些类型的游戏中作为一个彩蛋也是不错之选。

下面先看下效果,今天带大家做一个UVLight Reveal的效果


这里用到的插件Amplify Shader Editor 1.6.1,这个效果在原有包中是存在的,这里我结合了另外一种效果合并来说一下。
在这里插入图片描述

实现方案

  1. Light Attenuation Node
    光衰减节点包含统一的光和影信息。使用方向灯返回对象被直接照亮或处于阴影中的白色和黑色区域,这些区域将根据您的方向灯设置进行相应的更改。对于点光源和聚光灯,它还包含光的平滑衰减信息,该信息会随着范围设置的变化而变化。在这两种情况下都不包含光强或颜色信息,所以通常与同时包含光强和颜色信息的light color节点一起使用时,它会变得更有用。只有在执行某种自定义照明时才有用,因此,只有当将灯光模型设置为自定义照明时,节点才在available nodes菜单中可见,如果它恰好位于自定义照明之外,则会显示警告。
    注1:为简便起见,当光强为零时,衰减也为零。
    注2:此节点只应在与来自表面输出节点的自定义照明输入端口连接时使用。

  2. Light Color Node
    浅色节点输出浅色信息。RGB通道不包含光色,而是光色和光强相乘的结果。
    | 输出端口 | 描述 | 类型
    | RGBA | 返回原始的浅色矢量 | 颜色
    | Color | 返回光色乘以光强 , 对应于光色矢量的RGB通道 | Vector3
    | Intensity | 返回光强,光强对应于光色矢量的Alpha通道 | Float

  3. World Space Light Pos Node
    世界空间光Pos节点根据当前的光类型输出归一化的光方向向量或世界空间坐标中的光位置。
    对于方向灯,Dir/Pos输出将指定一个世界空间方向,并将类型设置为0。对于其他轻类型,Dir/Pos输出将指定一个世界空间位置,类型将被设置为1。

Dir/ pos | 根据当前的光类型返回光的方向或在世界空间坐标中的位置 | Float3
type表示光的类型 | 为方向灯返回1,为所有其他类型返回0 | Float

操作实现

1.Light

求出对应光照区域颜色 = 照亮或处于阴影中的白色和黑色区域 * 返回原始的浅色矢量
light area color = Light Attenuation * Light Color
Saturate为限定值区域[0,1]
将照亮出呈现Base Texture
在这里插入图片描述
效果图如下:
在这里插入图片描述

2.将另一个图形加入

与第一点相同求出对应光照区域颜色 = 照亮或处于阴影中的白色和黑色区域 * 返回原始的浅色矢量
light area color = Light Attenuation * Light Color
计算只有方向灯照射对应的区域 = light area color * World Space Light Pos
将照亮出呈现UV Texture
最后将1、2两者结合即可
在这里插入图片描述
效果如下:
在这里插入图片描述

3.加上图形效果

Panner用于Texture移动
Emission Speed火焰移动速度
HighLight 火焰最高亮度
注意:Register Local Var 和 Get Local Var是一对只能在当前Shader中使用
将做好的火焰移动效果点乘2中的UV Texture
在这里插入图片描述

效果如下:
在这里插入图片描述

4.加上灯光的颜色自定义判定

Component Mask掩码根据输入的格式来定GBRA 或者 XYZW
Normalize 单位向量化
Dot 向量A * 向量B
If[Community]判断A、B值传出值
Difference Threshold为颜色存在的最大差值
Color to Be Filtered指定的方向灯的颜色
在这里插入图片描述

效果如下:
在这里插入图片描述


源码

Shader “ASE/UVLight”
{
Properties
{
_Albedo(“Albedo”, 2D) = “white” {}
_UVTexture(“UV Texture”, 2D) = “white” {}
_Mask(“Mask”, 2D) = “white” {}
_DifferenceThreshold(“Difference Threshold”, Range( 0 , 0.05)) = 0
_Emission(“Emission”, 2D) = “white” {}
_HighLight(“HighLight”, Range( 0 , 2)) = 0.5555796
_EmissionSpeed(“Emission Speed”, Range( 0 , 1)) = 1
_ColortoBeFiltered(“Color to Be Filtered”, Color) = (0,0,0,0)
[HideInInspector] _texcoord( “”, 2D ) = “white” {}
[HideInInspector] __dirty( “”, Int ) = 1
}

SubShader
{Tags{ "RenderType" = "Opaque"  "Queue" = "Geometry+0" }Cull BackCGPROGRAM#include "UnityPBSLighting.cginc"#include "UnityShaderVariables.cginc"#pragma target 3.0#pragma surface surf StandardCustomLighting keepalpha addshadow fullforwardshadows struct Input{float2 uv_texcoord;};struct SurfaceOutputCustomLightingCustom{half3 Albedo;half3 Normal;half3 Emission;half Metallic;half Smoothness;half Occlusion;half Alpha;Input SurfInput;UnityGIInput GIData;};uniform sampler2D _Albedo;uniform float4 _Albedo_ST;uniform sampler2D _UVTexture;uniform float4 _UVTexture_ST;uniform sampler2D _Mask;uniform float4 _Mask_ST;uniform sampler2D _Emission;uniform float _EmissionSpeed;uniform float _HighLight;uniform float4 _ColortoBeFiltered;uniform float _DifferenceThreshold;inline half4 LightingStandardCustomLighting( inout SurfaceOutputCustomLightingCustom s, half3 viewDir, UnityGI gi ){UnityGIInput data = s.GIData;Input i = s.SurfInput;half4 c = 0;#ifdef UNITY_PASS_FORWARDBASEfloat ase_lightAtten = data.atten;if( _LightColor0.a == 0)ase_lightAtten = 0;#elsefloat3 ase_lightAttenRGB = gi.light.color / ( ( _LightColor0.rgb ) + 0.000001 );float ase_lightAtten = max( max( ase_lightAttenRGB.r, ase_lightAttenRGB.g ), ase_lightAttenRGB.b );#endif#if defined(HANDLE_SHADOWS_BLENDING_IN_GI)half bakedAtten = UnitySampleBakedOcclusion(data.lightmapUV.xy, data.worldPos);float zDist = dot(_WorldSpaceCameraPos - data.worldPos, UNITY_MATRIX_V[2].xyz);float fadeDist = UnityComputeShadowFadeDistance(data.worldPos, zDist);ase_lightAtten = UnityMixRealtimeAndBakedShadows(data.atten, bakedAtten, UnityComputeShadowFade(fadeDist));#endiffloat2 uv_Albedo = i.uv_texcoord * _Albedo_ST.xy + _Albedo_ST.zw;#if defined(LIGHTMAP_ON) && ( UNITY_VERSION < 560 || ( defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) && defined(SHADOWS_SCREEN) ) )//aselcfloat4 ase_lightColor = 0;#else //aselcfloat4 ase_lightColor = _LightColor0;#endif //aselcfloat4 temp_output_3_0 = ( ase_lightAtten * ase_lightColor );float2 uv_UVTexture = i.uv_texcoord * _UVTexture_ST.xy + _UVTexture_ST.zw;float2 uv_Mask = i.uv_texcoord * _Mask_ST.xy + _Mask_ST.zw;float2 panner36 = ( ( _Time.y * _EmissionSpeed ) * float2( 1,0 ) + float2( 0,0 ));float2 uv_TexCoord31 = i.uv_texcoord + panner36;float4 Emission28 = ( tex2D( _Mask, uv_Mask ) * ( tex2D( _Emission, uv_TexCoord31 ) * ( _HighLight * ( _SinTime.w + 1.5 ) ) ) );float3 normalizeResult39 = normalize( (( _WorldSpaceLightPos0.w * ase_lightColor )).rgb );float3 normalizeResult43 = normalize( (_ColortoBeFiltered).rgb );float dotResult44 = dot( normalizeResult39 , normalizeResult43 );c.rgb = ( ( tex2D( _Albedo, uv_Albedo ) * saturate( temp_output_3_0 ) ) + ( tex2D( _UVTexture, uv_UVTexture ) * ( temp_output_3_0 * _WorldSpaceLightPos0.w ) * Emission28 *  ( dotResult44 - _DifferenceThreshold > 1.0 ? 0.0 : dotResult44 - _DifferenceThreshold <= 1.0 && dotResult44 + _DifferenceThreshold >= 1.0 ? 1.0 : 0.0 )  ) ).rgb;c.a = 1;return c;}inline void LightingStandardCustomLighting_GI( inout SurfaceOutputCustomLightingCustom s, UnityGIInput data, inout UnityGI gi ){s.GIData = data;}void surf( Input i , inout SurfaceOutputCustomLightingCustom o ){o.SurfInput = i;}ENDCG
}
Fallback "Diffuse"
CustomEditor "ASEMaterialInspector"

}

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

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

相关文章

Aseprite编译

官方网站 : https://www.aseprite.org/ Aseprite编译 步骤 : 1> App Store 下载安装 XCode 2> 安装 brew # /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 或 # /bin/zsh -c "$(curl -fsSL https://g…

GoogleNetv1:Going deeper with convolutions更深的卷积神经网络

文章目录 GoogleNetv1全文翻译论文结构摘要1 引言2 相关工作3 动机和高层考虑稀疏矩阵 4 结构细节引入1x1卷积核可以减少通道数 5 GoogleNet6 训练方法7 ILSVRC 2014 分类挑战赛设置和结果8 ILSVRC 2014检测挑战赛设置和结果9 总结 论文研究背景、成果及意义论文图表 GoogleNet…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第六节 理解垃圾回收GC&#xff0c;提搞程序性能 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基…

YOLOv5改进 | 2023Neck篇 | CCFM轻量级跨尺度特征融合模块(RT-DETR结构改进v5)

一、本文介绍 本文给大家带来的改进机制是轻量级跨尺度特征融合模块CCFM&#xff08;Cross-Scale Feature Fusion Module&#xff09;其主要原理是&#xff1a;将不同尺度的特征通过融合操作整合起来&#xff0c;以增强模型对于尺度变化的适应性和对小尺度对象的检测能力。我将…

OpenHarmony南向之Audio

音频架构 Audio驱动框架基于HDF驱动框架实现&#xff0c;包含内核态&#xff08;KHDF&#xff09;&#xff0c;和用户态&#xff08;UHDF&#xff09;&#xff0c; 对北向提供音频HDI接口 音频框架图 驱动架构主要由以下几部分组成。 HDI adapter&#xff1a;实现Audio HAL层…

Spring 是如何解决循环依赖问题的方案

文章目录 Spring 是如何解决循环依赖问题的&#xff1f; Spring 是如何解决循环依赖问题的&#xff1f; 我们都知道&#xff0c;如果在代码中&#xff0c;将两个或多个 Bean 互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环。这是 Spring 发生循环依赖…

数据库开发之图形化工具以及表操作的详细解析

2.3 图形化工具 2.3.1 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句&#xff0c;在我们编写这些SQL时&#xff0c;都是在命令行当中完成的。大家在练习的时候应该也感受到了&#xff0c;在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff…

Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

1.首先认识一下NDK。 &#xff08;1&#xff09;什么是NDK&#xff1f; NDK全称是Native Development Kit&#xff0c;NDK提供了一系列的工具&#xff0c;帮助开发者快速开发C/C的动态库&#xff0c;并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器&#xff08;交叉…

Android 13 动态启用或禁用IPV6

介绍 客户想要通过APK来控制IPV6的启用和禁用&#xff0c;这里我们通过广播的方式来让客户控制IPV6。 效果展示 adb shell ifconfig 这里我们用debug软件&#xff0c;将下面节点置为1 如图ipv6已被禁用了 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 修改 接下来…

算法学习系列(十五):最小堆、堆排序

目录 引言一、最小堆概念二、堆排序模板&#xff08;最小堆&#xff09;三、模拟堆 引言 这个堆排序的话&#xff0c;考的还挺多的&#xff0c;主要是构建最小堆&#xff0c;并且在很多情况下某些东西还用得着它来优化&#xff0c;比如说迪杰斯特拉算法可以用最小堆优化&#…

Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十九章、Jasypt加密 Jasypt全称是Java Simplified Encryption&#xff0c;是一个开源项目。 Jasypt与Spring Boot集成&#xff0c;以便在应用程序的属性文件中加密敏感信息&#xff0c;然后在应用程序运行…

Openslide安装

文章目录 安装open-slide python下载openslide二进制文件解压到Anaconda的library目录下配置环境变量在py文件中添加以下语句即可 官网链接 安装open-slide python 表面上这样就可以导入了但事实上会遇到 Couldn’t locate OpendSlide DLL的问题&#xff0c;openslide必须独立安…

VSCODE : SSH远程配置+免密登录

SSH基础配置 填入地址&#xff0c;回车 ssh userhost-or-ip 然后选择默认的配置&#xff0c;回车&#xff0c;得到以下结果&#xff1a; 点击链接 选择远程的系统 输入密码 免密登录 生成SSH密钥&#xff1a; 首先&#xff0c;确保你已经在本地生成了SSH密钥。你可以使…

nodejs+vue+微信小程序+python+PHP的艺术展览馆艺术品管理系统-计算机毕业设计推荐

选择轻量级的关系型MySQL数据库存储数据。接着进行系统的需求分析、功能设计、数据库设计&#xff0c;最后进行编码实现。具体如下&#xff1a; 1&#xff09;网站首页&#xff1a;艺术品浏览展示&#xff0c;艺术品作者线下。供会员浏览查看。 2&#xff09;注册登录&#xff…

OpenCV-Python(21):OPenCV查找及绘制轮廓

1.认识轮廓 1.1 目标 理解什么是轮廓学习掌握找轮廓、绘制轮廓等学习使用cv2.findContours()、cv2.drawContours()函数的用法 1.2 什么是轮廓 在OpenCV中&#xff0c;轮廓是图像中连续的边界线的曲线&#xff0c;具有相同的颜色或者灰度&#xff0c;用于表示物体的形状。轮廓…

vue中使用echarts实现省市地图绘制,根据数据显示省市天气图标及温度信息

一、实现效果 使用echarts实现省市地图绘制根据数据显示省下市的天气图标根据数据显示省下市的温度信息 二、实现方法 1、安装echarts插件 npm install echarts --save2、获取省市json数据 https://datav.aliyun.com/portal/school/atlas/area_selector 通过 阿里旗下的高…

简述Redis备份策略以及对应的实现机制

引言 Redis作为高性能的内存数据库&#xff0c;数据的安全性至关重要。一旦数据丢失&#xff0c;可能会对业务造成重大影响。因此&#xff0c;备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …

easycython和cython将py编译为pyd对比

前提了解 为了实验的准确性&#xff0c;在全过程使用的python环境版本都为同一版本 easycython和cython编译为pyd文件的不同在于&#xff0c;easycython编译的原始文件后缀为pyx&#xff0c;cython编译的原始文件为py 1.cython 1.1原始文件 def ZWHCythonTest():print(&qu…

怎么用Facebook找客户?Facebook开发客户攻略分享

跨境人最了解的电商平台之一就是Facebook了&#xff0c;说到Facebook&#xff0c;它拥有超过20亿的活跃用户&#xff0c;所以你可以在这个平台上面找到更多的潜在客户。今天的文章就主要分享用Facebook开发客户的方法&#xff0c;全是干货&#xff0c;建议收藏&#xff01; 一、…

2024 年政府和技术预测

新的一年即将来临&#xff0c;这意味着专家、技术专家和专栏作家应该尝试预测 2024 年政府和技术即将出现的一些最大趋势。今年可能使这些预测变得更加困难的是事实上&#xff0c;许多技术正在以惊人的速度向前发展。在某些情况下&#xff0c;过去需要多年才能慢慢发生的变化现…