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 Back
	CGPROGRAM
	#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_FORWARDBASE
		float ase_lightAtten = data.atten;
		if( _LightColor0.a == 0)
		ase_lightAtten = 0;
		#else
		float3 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));
		#endif
		float2 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) ) )//aselc
		float4 ase_lightColor = 0;
		#else //aselc
		float4 ase_lightColor = _LightColor0;
		#endif //aselc
		float4 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"

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑&#xff0c;如果电脑系统坏了&#xff0c;就会影响自己正常使用电脑&#xff0c;这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤&#xff0c;那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

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

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

在电脑上免费分区的 5 个有效磁盘分区软件工具

磁盘分区可能是一个脆弱而复杂的过程&#xff0c;磁盘崩溃或用户设备受到病毒攻击的风险很高。因此&#xff0c;它们很难由用户单独或手动管理。本文详细介绍了可以帮助简化磁盘分区过程的不同软件工具、它们的功能和优点。那么让我们开始吧。 什么是磁盘分区工具&#xff1f; …

企业级依赖管理: 深入解读 Maven BOM

一、背景 当开发者在一个大型项目中使用 Maven 进行依赖管理时&#xff0c;项目往往会包含多个模块或子项目&#xff0c;并且这些模块会共享相同的依赖项。但是&#xff0c;不同模块可能会独立地指定各自的依赖版本&#xff0c;这可能导致以下问题&#xff1a; 依赖版本不一致…

116基于matlab的盲源信号分离

基于matlab的盲源信号分离。FASTICA方法&#xff0c;能够很好的将信号解混&#xff0c;可以替换数据进行分析。具有GUI界面&#xff0c;可以很好的进行操作。程序已调通&#xff0c;可直接运行。 116matlab盲源信号分离FASTICA (xiaohongshu.com)

java对象整理

1.对象的创建过程 首先class文件加载到内存中 这个过程如下 “加载”是“类加载”(Class Loading)过程的第一步。这个加载过程主要就是靠类加载器实现的&#xff0c; 包括用户自定义类加载器。 加载到内存后做的事情 申请对象内存 成员变量赋默认值 调用构造方法 成员变量顺序…

nginx报错upstream sent invalid header

nginx报错upstream sent invalid header 1.报错背景 最近由于nginx 1.20的某个漏洞需要升级到nginx1.25的版本。在测试环境升级完nginx后&#xff0c;发现应用直接报错502 bad gateway了。 然后查看nginx的errlog&#xff0c;发现&#xff1a; upstream sent invalid head…

【计算机视觉】角点检测(Harris、SIFT)

Harris 角点指的是窗口延任意方向移动&#xff0c;都有很大变化量的点。 用数学公式表示为&#xff1a; E(u,v)反映的移动后窗口的差异&#xff0c;w(x,y)为每个像素的点权值&#xff0c;I(xu,yv)是移动的像素值&#xff0c;I(x,y)是移动前的像素值。 将E(u,v)进行泰勒展开&am…

uni-appcss语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

二-从C到C++

本章会介绍一些C拓展的非面向对象的功能 引用 1 概念 引用从一定程度上讲是指针的平替&#xff0c;几乎被所有的面向对象语言所使用。引用相当于对某一目标变量起“别名”。 操作这个别名&#xff0c;与操作原变量一样。&#xff08;操作同一块地址&#xff09;不能有相同别名 …

ssrf之dict协议和file协议

1.dict协议 dict是什么协议呢&#xff1f; 定义&#xff1a;词典网络协议&#xff0c;在RFC 2009中进行描述。它的目标是超越Webster protocol&#xff0c;并允许客户端在使 用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。 官方介绍&#xff1a;http://dict.o…

文件监控-IT安全管理软件

文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化&#xff0c;防止未经授权的访问和修改&#xff0c;并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动&#xff0c;包括文件的创建、修…

k8s配置安装ingress服务

k8s配置安装ingress服务 在kuboard页面,网络安装 安装完配置名称保存 apiVersion: networking.k8s.io/v1 kind: Ingress metadata:namespace: testname: pipeline spec:ingressClassName: ingressrules:- host: test.pipeline.comhttp:paths:- path: /pathType: Prefixbacke…

3D视觉-结构光测量法

概述 结构光测量法是一种通过光学投射模块将具有编码信息的结构光投射到物体表面&#xff0c;在被测物表面上形成由被测物体表面形状调制的光条图像&#xff0c;再由图像采集系统采集被测物表面漫反射的光条图像&#xff0c;通过高精度算法处理后&#xff0c;得出被测物表面的三…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中&#xff0c;很多查询语句需要进行GROUP BY分组汇总&#xff0c;但是一旦经过分组&#xff0c;SELECT返回的记录数就会减少。为了保留所有原始行记录&#xff0c;并且仍可以进行分组数据分析&#xff0c;分析函数应运而生。 Oracle 8i 版本开始支持窗…

WebService

调试工具&#xff1a;Postman、SoapUI Soap WebService :.net WCF 、Java CFX WebService三要素&#xff1a; SOAP&#xff08;Simple Object Access Protocol&#xff09;&#xff1a;用来描述传递信息的格式&#xff0c; 可以和现存的许多因特网协议和格式结合使用&#x…

ClickHouse基础知识(六):ClickHouse的副本配置

副本的目的主要是保障数据的高可用性&#xff0c;即使一台 ClickHouse 节点宕机&#xff0c;那么也可以 从其他服务器获得相同的数据。 1. 副本写入流程 2. 配置步骤 ➢ 启动 zookeeper 集群 ➢ 在hadoop101的/etc/clickhouse-server/config.d目录下创建一个名为metrika.xml…

VUE3实现点击按钮下载文件功能

VUE3实现点击按钮下载文件功能 在写vue项目时&#xff0c;有个需求是点击表格中某一行的下载按钮&#xff0c;然后开始下载这一行对应的文件&#xff0c;效果如下&#xff1a; 表格每行的最右侧的蓝色按钮就是点击下载&#xff0c;这里涉及到原生的JavaScript写法&#xff0c;…

Android集成OpenSSL实现加解密-集成

导入so 将编译生成的 OpenSSL 动态库文件&#xff08;.so 文件&#xff09;复制到你的 Android 项目的 libs 目录中 导入头文件 将编译生成的include文件夹导入到项目中 build.gradle添加配置 defaultConfig {……testInstrumentationRunner "androidx.test.runner…

Qt/C++音视频开发62-电子放大/按下选择区域放大显示/任意选取区域放大

一、前言 电子放大这个功能思考了很久&#xff0c;也是一直拖到近期才静下心来完整这个小功能&#xff0c;这个功能的前提&#xff0c;主要得益于之前把滤镜打通了&#xff0c;玩出花样来了&#xff0c;只要传入对应的滤镜字符串&#xff0c;就可以实现各种各样的效果&#xf…