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

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

UVLight Reveal 实现验钞机的效果

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

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


这里用到的插件Amplify Shader Editor 1.6.1,这个效果在原有包中是存在的,这里我结合了另外一种效果合并来说一下。
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

实现方案

  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
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE
效果图如下:
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

2.将另一个图形加入

与第一点相同求出对应光照区域颜色 = 照亮或处于阴影中的白色和黑色区域 * 返回原始的浅色矢量
light area color = Light Attenuation * Light Color
计算只有方向灯照射对应的区域 = light area color * World Space Light Pos
将照亮出呈现UV Texture
最后将1、2两者结合即可
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE
效果如下:
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

3.加上图形效果

Panner用于Texture移动
Emission Speed火焰移动速度
HighLight 火焰最高亮度
注意:Register Local Var 和 Get Local Var是一对只能在当前Shader中使用
将做好的火焰移动效果点乘2中的UV Texture
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

效果如下:
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

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

Component Mask掩码根据输入的格式来定GBRA 或者 XYZW
Normalize 单位向量化
Dot 向量A * 向量B
If[Community]判断A、B值传出值
Difference Threshold为颜色存在的最大差值
Color to Be Filtered指定的方向灯的颜色
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE

效果如下:
Unity Shader UVLightReveal (紫外线显示,验钞效果),Unity,Shader研究与学习,unity,游戏引擎,Shader,ASE


源码

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"

}文章来源地址https://www.toymoban.com/news/detail-773952.html

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

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

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

相关文章

  • STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066

    STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 Proteus 仿真小实验: STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 功能: 硬件组成:STM32F103R6单片机 +LCD1602显示器+DHT11温度湿度+电位器模拟二氧化碳+LED模拟紫外线消毒+LED灯模拟加湿+LED灯

    2024年02月16日
    浏览(40)
  • Unity Shader Cull(双面显示)

    先不概述了原理我也不是很理解,但找到办法就分享出来。 首先使用Unity并不是很熟的原因吧,双面显示很简单的东西都得设及Shader创建,那不说多了直接进入正题! 首先先创建个URP,资产栏创建 ShaderGraph—URP—LitshaderGraph 我们就得到了一个标准编辑器的一个东西 双击打开

    2024年02月12日
    浏览(34)
  • 解决在VS中编写Unity Shader代码高亮显示、代码补全、自动缩进

    此教程为安装VS编写Unity Shader工具插件安装教程 本人刚开始学习Unity Shader,发现得安装了VS上的插件才可以拥有一个比较好的写Shader代码的体验,所以把自己的方法分享出来,希望可以帮到个位 先点击扩展中的管理扩展 在联机右上角搜索栏中搜索Shader,然后下载ShaderLabVS 此插

    2024年02月15日
    浏览(60)
  • 解决在VS Code中编写Unity Shader代码高亮显示、代码补全、自动缩进

    之前写过一篇解决在VS中编写Unity Shader代码高亮显示、代码补全、自动缩进的文章VS中编写Shader,但在使用过程中个人感觉VS的代码高亮不是很合理,所以后面用了VS Code,本文就是对解决在VS Code中编写Unity Shader代码高亮显示、代码补全、自动缩进的教程。 先看看对比图吧 VS

    2024年02月12日
    浏览(41)
  • 【Unity Shader】Shader Graph

    shader graph 入门: (对基础内容进行详细介绍) Shader Graph入门-CSDN博客 unity-shader(入门)_unity3d shader-CSDN博客 各种效果的节点配置: 【unity造轮子】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)_unity特效-CSDN博客 大佬文章里所用的PBR Master更新后已经没有了,所以参考

    2024年02月01日
    浏览(57)
  • Unity Shader variants (shader 变体)

    官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.jianshu.com/p/48ad75f0b4b9 https://www.jianshu.com/p/3e6b84317097 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变量(其实是开关 下面会说) 记住 #pragma multi_compil

    2024年02月12日
    浏览(34)
  • Unity | Shader基础知识(第一集:unity中最简单的shader)

    目录 一、unity的shader 二、创建一个shader(在创建时,选前三种都可以) 三、内容解读 1.shader一直都在 2.我们写shader在写什么 四、没有被干预的shader(最简单的shader) 相关阅读 编写着色器概述 - Unity 手册 一、unity的shader unity写的shader并不是真正意义上的shader。 官方解释:

    2024年02月04日
    浏览(51)
  • 【Unity Shader】Unity阴影

    记录下在unity中如果想实现阴影,有哪些路子可以选择,目前看有两种 1.经典的shadowmap 2.planar projection 如果开启renderer组件的cast shadows为on,开启平行光的light组件的shadow type,那么就会在物体shader中寻找LightMode=ShadowCaster的Pass进行渲染 场景有两个物体,平面和球体,使用unity内

    2024年02月09日
    浏览(57)
  • Unity | Shader基础知识(什么是shader)

    Shader的中文名叫着色器。 着色器的作用: 这个世界是3D的,包括在Unity的场景中,我们建的球球,方块块之类的,都是3D的,但是,屏幕是2D的,把3D的东西,通过颜色的汇总,显示在2D的屏幕上。 想知道颜色是怎么合到一起的,我们就找个图片,把它拆开看。 因为世界上所有

    2024年02月15日
    浏览(61)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包