Unity模拟薄膜干涉效果

Unity制作薄膜干涉效果,色彩斑斓的黑色石头

  大家好,我是阿赵。
  这次来做一个模拟薄膜干涉的彩色效果,Shader是使用ASE来连接,也算是ASE做复杂一点的效果的一个例子吧。

一、什么是薄膜干涉

  以下解释来源于百度百科:假设照射一束光波于薄膜,由于折射率不同,光波会被薄膜的上界面与下界面分别反射,因相互干涉而形成新的光波,这现象称为薄膜干涉。
  比如这种肥皂泡,在表面,会看到很多彩色的效果,这就是薄膜干涉想效果了。
在这里插入图片描述

二、模拟薄膜干涉效果的思路

  从原理来说,这个薄膜干涉的效果是通过多次不同折射率反射的光波叠加得到的,如果真的用这个算法去实现,消耗有点大。不过作为游戏里面的美术效果,有很多方法可以模拟的。
  首先需要分析一下,薄膜干涉的效果是怎样形成的。
1、由于是薄膜的上下界面分别反射的效果,所以按道理来说,应该有2个环境投影
2、环境投影过来的色彩,经过了叠加置换,形成了五彩斑斓的效果。
  知道了这两个效果之后,就可以逐个去模拟了。

1、先看第一个效果,2个环境投影。

  如果要真的反射或者折射场景本身的东西作为效果,那样消耗很大。但之前已经多次用过的一种手段,可以帮助我们模拟假反射效果,那就是Matcap了。
所以要实现2个环境投影的效果,实际上我们可以通过添加2张Matcap贴图来叠加实现

2、色彩斑斓的效果

  想实现多种颜色的叠加,除了真的算出来以外,还有一种更简单的办法,就是我们直接指定一张色彩渐变的图,作为多种色彩的采样图,然后再根据一定的规则去计算UV,就能得到一种假的色彩斑斓的效果。

三、在Unity里面实现模拟薄膜干涉

  既然上面已经有了思路,那么下面就比较快的用ASE节点连接一下,实现这种效果。
  首先,我们要实现的是整个表面的薄膜干涉:
  这里有一个甲虫的模型,赋予上漫反射贴图和法线贴图后的效果是这样:
在这里插入图片描述

  现在的ASE连线是这样:
  首先漫反射贴图和颜色的控制,是基本固定下来了,所以给他注册一个变量
在这里插入图片描述

  然后简单的把漫反射颜色和法线贴图连接一下给输出
在这里插入图片描述

  这是基础效果,接下来开始逐个效果加进去,让他形成最终的效果:
在这里插入图片描述

1、2层Matcap效果的实现:

  虽然是两层Matcap,但Matcap采样的UV是一样的,所以可以先算出Matcap的UV:
在这里插入图片描述

  为了能有一个变量同时控制2层Matcap的强度,所以先注册了一个变量
在这里插入图片描述

  接下来很简单,拿刚才算出的UV采样2张Matcap贴图,然后乘以强度控制的变量,最后叠加在一起就行了。
在这里插入图片描述

  现在我们已经有了Matcap假环境反射效果,所以可以和原来的漫反射颜色叠加,由于法线贴图已经在计算Matcap的时候使用过了,这里其实可以不用再赋予法线贴图给输出:
在这里插入图片描述

  现在甲虫的效果是这样的:
在这里插入图片描述

  现在反射了2种环境:
在这里插入图片描述

2、做色彩斑斓的效果

  上面分析原理的时候说过,我们是模拟效果,所以是用一张彩色渐变图来实现的,比如这样:
在这里插入图片描述

  接下来,通过特殊的UV计算,对这张彩色渐变图进行采样:
在这里插入图片描述

  想达到的效果是通过世界法线方向和观察方向做点乘(NdotV,和做轮廓光的计算一样),然后在作为UV采样彩色渐变图,让这张渐变图有一种跟随这法线方向从中间到四周渐变彩色的效果。
  由于是要改变漫反射的颜色,所以把求得的ramVal和漫反射颜色相乘,然后再加上Matcap的颜色:
在这里插入图片描述

  再根据实际情况调整一下之前Matcap的强度控制值,就能得到效果:
在这里插入图片描述

  调整参数,可以让颜色变化
在这里插入图片描述

  到这一步,这个效果差不多是做完了,可以先看看ASE生成的代码,用ASE打开,可以看看节点的连接情况:

// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "azhao/ThinFilm"
{
	Properties
	{
		_diffuseTex1("_diffuseTex", 2D) = "white" {}
		_diffuseCol1("diffuseCol", Color) = (0.5377358,0.5377358,0.5377358,0)
		_matCapTex1("_matCapTex", 2D) = "white" {}
		_matCap2Tex1("_matCap2Tex", 2D) = "white" {}
		_matcapLen1("_matcapLen", Float) = 1
		_matcap2Len1("_matcap2Len", Float) = 1
		_matcapStr1("matcapStr", Range( 0 , 1)) = 0
		[Normal]_normalTex2("_normalTex", 2D) = "bump" {}
		_ramTex1("_ramTex", 2D) = "white" {}
		_min1("min", Range( 0 , 1)) = 0
		_max1("max", Range( 0 , 1)) = 1
		[HideInInspector] _texcoord( "", 2D ) = "white" {}
		[HideInInspector] __dirty( "", Int ) = 1
	}

	SubShader
	{
		Tags{ "RenderType" = "Opaque"  "Queue" = "Geometry+0" }
		Cull Back
		CGINCLUDE
		#include "UnityShaderVariables.cginc"
		#include "UnityPBSLighting.cginc"
		#include "Lighting.cginc"
		#pragma target 3.0
		#ifdef UNITY_PASS_SHADOWCASTER
			#undef INTERNAL_DATA
			#undef WorldReflectionVector
			#undef WorldNormalVector
			#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
			#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
			#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
		#endif
		struct Input
		{
			float2 uv_texcoord;
			float3 worldNormal;
			INTERNAL_DATA
			float3 worldPos;
		};

		uniform sampler2D _diffuseTex1;
		uniform float4 _diffuseTex1_ST;
		uniform float4 _diffuseCol1;
		uniform sampler2D _ramTex1;
		uniform float _min1;
		uniform float _max1;
		uniform sampler2D _matCap2Tex1;
		uniform sampler2D _normalTex2;
		uniform float4 _normalTex2_ST;
		uniform float _matcap2Len1;
		uniform float _matcapStr1;
		uniform sampler2D _matCapTex1;
		uniform float _matcapLen1;

		void surf( Input i , inout SurfaceOutputStandard o )
		{
			o.Normal = float3(0,0,1);
			float2 uv_diffuseTex1 = i.uv_texcoord * _diffuseTex1_ST.xy + _diffuseTex1_ST.zw;
			float4 diffuseCol5 = ( tex2D( _diffuseTex1, uv_diffuseTex1 ) * _diffuseCol1 );
			float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );
			float3 ase_worldPos = i.worldPos;
			float3 ase_worldViewDir = normalize( UnityWorldSpaceViewDir( ase_worldPos ) );
			float dotResult44 = dot( ase_worldNormal , ase_worldViewDir );
			float clampResult48 = clamp( ( 1.0 - dotResult44 ) , _min1 , _max1 );
			float2 temp_cast_0 = (clampResult48).xx;
			float4 ramVal50 = tex2D( _ramTex1, temp_cast_0 );
			float2 uv_normalTex2 = i.uv_texcoord * _normalTex2_ST.xy + _normalTex2_ST.zw;
			float2 matcapUV38 = ( ( (mul( float4( (WorldNormalVector( i , UnpackNormal( tex2D( _normalTex2, uv_normalTex2 ) ) )) , 0.0 ), UNITY_MATRIX_V ).xyz).xy + 1.0 ) * 0.5 );
			float matcapStrength27 = _matcapStr1;
			float4 matcapCol26 = ( ( tex2D( _matCap2Tex1, matcapUV38 ) * ( _matcap2Len1 * matcapStrength27 ) ) + ( tex2D( _matCapTex1, matcapUV38 ) * ( _matcapLen1 * matcapStrength27 ) ) );
			o.Albedo = ( ( diffuseCol5 * ramVal50 ) + matcapCol26 ).rgb;
			o.Alpha = 1;
		}

		ENDCG
		CGPROGRAM
		#pragma surface surf Standard keepalpha fullforwardshadows 

		ENDCG
		Pass
		{
			Name "ShadowCaster"
			Tags{ "LightMode" = "ShadowCaster" }
			ZWrite On
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 3.0
			#pragma multi_compile_shadowcaster
			#pragma multi_compile UNITY_PASS_SHADOWCASTER
			#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
			#include "HLSLSupport.cginc"
			#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
				#define CAN_SKIP_VPOS
			#endif
			#include "UnityCG.cginc"
			#include "Lighting.cginc"
			#include "UnityPBSLighting.cginc"
			struct v2f
			{
				V2F_SHADOW_CASTER;
				float2 customPack1 : TEXCOORD1;
				float4 tSpace0 : TEXCOORD2;
				float4 tSpace1 : TEXCOORD3;
				float4 tSpace2 : TEXCOORD4;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				UNITY_VERTEX_OUTPUT_STEREO
			};
			v2f vert( appdata_full v )
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID( v );
				UNITY_INITIALIZE_OUTPUT( v2f, o );
				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
				UNITY_TRANSFER_INSTANCE_ID( v, o );
				Input customInputData;
				float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
				half3 worldNormal = UnityObjectToWorldNormal( v.normal );
				half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
				half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
				half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
				o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
				o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
				o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
				o.customPack1.xy = customInputData.uv_texcoord;
				o.customPack1.xy = v.texcoord;
				TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
				return o;
			}
			half4 frag( v2f IN
			#if !defined( CAN_SKIP_VPOS )
			, UNITY_VPOS_TYPE vpos : VPOS
			#endif
			) : SV_Target
			{
				UNITY_SETUP_INSTANCE_ID( IN );
				Input surfIN;
				UNITY_INITIALIZE_OUTPUT( Input, surfIN );
				surfIN.uv_texcoord = IN.customPack1.xy;
				float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
				half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
				surfIN.worldPos = worldPos;
				surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
				surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
				surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
				surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
				SurfaceOutputStandard o;
				UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandard, o )
				surf( surfIN, o );
				#if defined( CAN_SKIP_VPOS )
				float2 vpos = IN.pos;
				#endif
				SHADOW_CASTER_FRAGMENT( IN )
			}
			ENDCG
		}
	}
	Fallback "Diffuse"
	CustomEditor "ASEMaterialInspector"
}
/*ASEBEGIN
Version=18500
522;578;1920;715;1433.327;283.2714;1.3;True;True
Node;AmplifyShaderEditor.CommentaryNode;11;-2151.8,-962.4486;Inherit;False;1282.428;497.9202;Comment;10;38;37;36;35;34;33;32;31;30;29;matcapUV;1,1,1,1;0;0
Node;AmplifyShaderEditor.SamplerNode;29;-2079.031,-869.7596;Inherit;True;Property;_normalTex2;_normalTex;7;1;[Normal];Create;True;0;0;False;0;False;-1;None;bcace47d828d6584ca2e497db46da532;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.WorldNormalVector;30;-1760.862,-891.8605;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.ViewMatrixNode;31;-1745.651,-711.2565;Inherit;False;0;1;FLOAT4x4;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;32;-1552.764,-824.0817;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT4x4;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SwizzleNode;33;-1415.188,-864.1566;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;34;-1523.613,-692.6346;Inherit;False;Constant;_Float1;Float 0;0;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleAddOpNode;36;-1348.294,-741.2067;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.CommentaryNode;41;-2055.848,506.4452;Inherit;False;1372.112;427.2333;Comment;9;50;49;48;47;46;45;44;43;42;ramVal;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;35;-1467.336,-562.9716;Inherit;False;Constant;_Float2;Float 1;0;0;Create;True;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;12;-781.2891,-759.7816;Inherit;False;704.9028;218.6006;Comment;2;28;27;matcapStrengthg;1,1,1,1;0;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;37;-1265.293,-579.9235;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;28;-719.2891,-703.7806;Inherit;False;Property;_matcapStr1;matcapStr;6;0;Create;True;0;0;False;0;False;0;0.117;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.ViewDirInputsCoordNode;42;-1985.25,738.8439;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.WorldNormalVector;43;-1992.847,590.2448;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.DotProductOpNode;44;-1760.65,647.6448;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;27;-348.5472,-708.1805;Inherit;False;matcapStrength;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;38;-1109.383,-672.5885;Inherit;False;matcapUV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.CommentaryNode;13;-2157.141,-259.6156;Inherit;False;1457.371;571.3273;Comment;13;26;25;24;23;22;21;20;19;18;17;16;15;14;MatcapCol;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;46;-1709.831,754.3938;Inherit;False;Property;_min1;min;9;0;Create;True;0;0;False;0;False;0;0.218;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;1;-2045.915,-1593.317;Inherit;False;882.3721;436.7761;Comment;4;5;4;3;2;diffuseCol;1,1,1,1;0;0
Node;AmplifyShaderEditor.OneMinusNode;45;-1598.85,653.5448;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;15;-1595.132,-141.8086;Inherit;False;Property;_matcap2Len1;_matcap2Len;5;0;Create;True;0;0;False;0;False;1;2.63;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;47;-1708.947,855.3768;Inherit;False;Property;_max1;max;10;0;Create;True;0;0;False;0;False;1;0.541;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;24;-1592.537,199.5534;Inherit;False;27;matcapStrength;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;14;-2109.24,64.27048;Inherit;False;38;matcapUV;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.GetLocalVarNode;16;-1589.362,-59.90956;Inherit;False;27;matcapStrength;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;23;-1573.821,99.57846;Inherit;False;Property;_matcapLen1;_matcapLen;4;0;Create;True;0;0;False;0;False;1;-0.1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;3;-1927.229,-1344.125;Inherit;False;Property;_diffuseCol1;diffuseCol;1;0;Create;True;0;0;False;0;False;0.5377358,0.5377358,0.5377358,0;1,1,1,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;17;-1896.613,-208.7635;Inherit;True;Property;_matCap2Tex1;_matCap2Tex;3;0;Create;True;0;0;False;0;False;-1;None;7b6c994ca124f7844933ff29a828e014;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;18;-1916.894,41.37045;Inherit;True;Property;_matCapTex1;_matCapTex;2;0;Create;True;0;0;False;0;False;-1;None;63f4deeba79a05045a23bd4efde60741;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.ClampOpNode;48;-1395.935,658.2618;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;22;-1348.521,129.2014;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;19;-1359.421,-106.9806;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;2;-1995.915,-1543.317;Inherit;True;Property;_diffuseTex1;_diffuseTex;0;0;Create;True;0;0;False;0;False;-1;None;dece56f96937a38409c05ec12d763248;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;21;-1198.078,8.469454;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SamplerNode;49;-1233.468,629.3298;Inherit;True;Property;_ramTex1;_ramTex;8;0;Create;True;0;0;False;0;False;-1;617568684d4604945b0e1e0268720cd6;d41989414fad7d9429737d617855f3f0;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;20;-1187.935,-175.5155;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;4;-1604.776,-1450.349;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;50;-907.7362,642.6719;Inherit;False;ramVal;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;5;-1388.002,-1447.403;Inherit;False;diffuseCol;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleAddOpNode;25;-1044.312,-90.04456;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;7;-269.9716,-100.0286;Inherit;False;5;diffuseCol;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;51;-275.8423,19.81351;Inherit;False;50;ramVal;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;26;-920.8224,-80.59351;Inherit;False;matcapCol;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;40;-237.3033,141.2637;Inherit;False;26;matcapCol;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;52;-36.84229,-31.18649;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleAddOpNode;39;115.6226,21.99689;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.StandardSurfaceOutputNode;0;263.2036,22.30539;Float;False;True;-1;2;ASEMaterialInspector;0;0;Standard;azhao/ThinFilm;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;Back;0;False;-1;0;False;-1;False;0;False;-1;0;False;-1;False;0;Opaque;0.5;True;True;0;False;Opaque;;Geometry;All;14;all;True;True;True;True;0;False;-1;False;0;False;-1;255;False;-1;255;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;False;2;15;10;25;False;0.5;True;0;0;False;-1;0;False;-1;0;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;0;0,0,0,0;VertexOffset;True;False;Cylindrical;False;Relative;0;;-1;-1;-1;-1;0;False;0;0;False;-1;-1;0;False;-1;0;0;0;False;0.1;False;-1;0;False;-1;False;16;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT;0;False;9;FLOAT;0;False;10;FLOAT;0;False;13;FLOAT3;0,0,0;False;11;FLOAT3;0,0,0;False;12;FLOAT3;0,0,0;False;14;FLOAT4;0,0,0,0;False;15;FLOAT3;0,0,0;False;0
WireConnection;30;0;29;0
WireConnection;32;0;30;0
WireConnection;32;1;31;0
WireConnection;33;0;32;0
WireConnection;36;0;33;0
WireConnection;36;1;34;0
WireConnection;37;0;36;0
WireConnection;37;1;35;0
WireConnection;44;0;43;0
WireConnection;44;1;42;0
WireConnection;27;0;28;0
WireConnection;38;0;37;0
WireConnection;45;0;44;0
WireConnection;17;1;14;0
WireConnection;18;1;14;0
WireConnection;48;0;45;0
WireConnection;48;1;46;0
WireConnection;48;2;47;0
WireConnection;22;0;23;0
WireConnection;22;1;24;0
WireConnection;19;0;15;0
WireConnection;19;1;16;0
WireConnection;21;0;18;0
WireConnection;21;1;22;0
WireConnection;49;1;48;0
WireConnection;20;0;17;0
WireConnection;20;1;19;0
WireConnection;4;0;2;0
WireConnection;4;1;3;0
WireConnection;50;0;49;0
WireConnection;5;0;4;0
WireConnection;25;0;20;0
WireConnection;25;1;21;0
WireConnection;26;0;25;0
WireConnection;52;0;7;0
WireConnection;52;1;51;0
WireConnection;39;0;52;0
WireConnection;39;1;40;0
WireConnection;0;0;39;0
ASEEND*/
//CHKSM=0B2FF8580E96CBA9E432244BACE7B0766F17EA8A

3、表面凹凸的材质薄膜干涉

在这里插入图片描述

  刚才做的甲虫,表面算是比较的光滑,整体的出现薄膜干涉也是很正常的。文章开头有一个视频,上面这块金属,是不应该整体出现薄膜干涉的,他只是在高光强烈的地方,产生了色彩斑斓的效果。
  这个效果我就不给源码了,大概给一下思路,各位可以自己试试:
1、彩色贴图采样的ramVal不要和漫反射直接相乘,而是先和Matcap的结果相乘,这样就不会在整个模型产生彩色,二只有在Matcap反射强烈的地方产生彩色
2、通过一个参数来控制Matcap和ramVal之间的互补关系
大概的连线是这样的:
在这里插入图片描述

  这里我是连到Emission里面,这个通道是自发光,所以最后得到的颜色会稍微更亮一些,如果连到漫反射的albedo通道,其实也是可以的,颜色就稍微没那么亮。

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

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

相关文章

白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理

两年前听瀚高的一个朋友说他们要做一个开源数据库项目,基于PostgreSQL,主打与Oracle的兼容性,并且与PG社区版内核同步发布。当时我听了有点不太相信,瀚高的Highgo是在PG内核上增加了一定的Oracle兼容性的特性,一般也会…

#gStore-weekly | gBuilder功能详解之表单录入

gBuilder除了可以提供结构化数据映射以及非结构化数据抽取两种构建知识图谱的方式以外,还提供了表单录入的方式来构建知识图谱的数据,用户只需要根据设计好的schema将实体、属性以及关系通过填写表单的形式录入,再通过一键生成NT文件即可获得…

HTTP1.1升级HTTP2.0

HTTP1.1升级HTTP2.0 一,前言介绍 1.为什么要升级http2.0 HTTP2.0相比于HTTP1.x有以下几个优点: 二进制分帧:HTTP2.0将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们进行编码,这样可以更好地对数据进行…

国家开放大学平时作业训练题

卷代号:1400 机器人技术及应用 参考试题 一、单项选择题(每小题3分,共45分) 1.在变径轮和变形车轮的设计中,借鉴了( )的设计,使得车轮可以主动变形进行越障。 A.滑块机构 …

MR混合现实教学系统在汽车检修与维护课堂教学中的应用

传统的汽车检修与维护课堂教学主要依赖教师口头讲解和黑板演示,这种方式存在一定的局限性。首先,对于一些复杂的机械结构和操作过程,教师难以生动形象地展示给学生。其次,学生无法直接观察到实际操作中的细节和注意事项&#xff0…

Python CleverCSV指南,让CSV不再难搞

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python CleverCSV指南,让CSV不再难搞,文章58000字,阅读大约15分钟,大家enjoy~~ CleverCSV是一个Python库,专注于提…

vue过渡,vue3组合式API详细介绍

7.过渡效果 vue提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画 Transition会在一个元素或组件进入和离开DOM时应用动画TransitionGroup会在一个v-for列表中的元素或组件被插入,移动,或移除时应用动画 7-1过渡效果 过渡模式 <Transition mode"out-in&q…

系列二、Lock接口

一、多线程编程模板 线程 操作 资源类 高内聚 低耦合 二、实现步骤 1、创建资源类 2、资源类里创建同步方法、同步代码块 三、12306卖票程序 3.1、synchronized实现 3.1.1、Ticket /*** Author : 一叶浮萍归大海* Date: 2023/11/20 8:54* …

python趣味编程-5分钟实现一个贪吃蛇游戏(含源码、步骤讲解)

Python 贪吃蛇游戏代码是用 Python 语言编写的。在这个贪吃蛇游戏中,Python 代码是增强您在创建和设计如何使用 Python 创建贪吃蛇游戏方面的技能和才能的方法。 Python Tkinter中的贪吃蛇游戏是一个简单干净的 GUI,可轻松玩游戏。游戏设计非常简单,用户不会觉得使用和理解…

车载毫米波雷达行业发展5——企业

5.1 博世 5.1.1 公司简介 博世集团创立于 1886 年&#xff0c;业务涵盖汽车与智能交通技术、工业技术、消费品、能源与建 筑技术四大领域&#xff0c;是德国最大的工业企业之一、全球最大的汽车零部件供应商、最早研究车载毫米波雷达的企业之一。博世在高级辅助驾驶和自动驾驶…

数据库管理工具,你可以用Navicat,但我选DBeaver!

大家好&#xff0c;我是豆小匠。数据库GUI工具哪家强&#xff0c;众人遥指Navicat。 可是Navicat老贵了。 如果公司有正版授权的还好&#xff0c;如果没有正版授权&#xff0c;还不给你用盗版&#xff0c;那才叫绝绝子。 好了&#xff0c;主角登场&#xff0c;DBeaver&#x…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…

cadence layout lvs时出现error

Error&#xff1a;Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下&#xff1a; cadence layout lvs时出现error-CSDN博客

Ps:陷印

在准备图像进行专业印刷之前&#xff0c;陷印 Trap是一个重要的步骤。 在彩色印刷中&#xff0c;多种颜色的墨水通常分别印刷。陷印是一种叠印技术&#xff0c;它可避免打印时印版的微小偏差或移动而使打印图像出现微小的缝隙。 进行陷印处理以纠正未对齐现象 A. 未对齐现象&am…

一个完备的手游地形实现方案

一、地形几何方案&#xff1a;Terrain 与 Mesh 1.1 目前手游主流地形几何方案分析 先不考虑 LOD 等优化手段&#xff0c;目前地形的几何方案选择有如下几种&#xff1a; 使用 Unity 自带的 Terrain使用 Unity 自带的 Terrain&#xff0c;但是等美术资产完成后使用工具转为 M…

Day36力扣打卡

打卡记录 T 秒后青蛙的位置&#xff08;DFS&#xff09; 链接 class Solution:def frogPosition(self, n: int, edges: List[List[int]], t: int, target: int) -> float:g [[] for _ in range(n 1)]for x, y in edges:g[x].append(y)g[y].append(x)g[1].append(0)ans …

Uniapp矩阵评分组件

uniapp矩阵评分组件支持自定义图标、选择颜色、评分等级。 <template><view style"width: 100%;overflow: hidden;"><view class"flex-sub flex-table flex flex-direction-column":style"{ --table-border-color: tableBorderColor…

Swifit学习第一天

学到了什么&#xff1a; 布局&#xff1a;ZStack 、HStack、VStack、Image 其它&#xff1a;点击事件、属性包装器ClampedValue、三目运算 1、图片缩放 2、属性包装器

Arcgis 日常天坑问题2——三维场景不能不能加载kml图层,着手解决这个问题

arcgis js api官网介绍kml图层的地址&#xff1a; https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-KMLLayer.html从文档里看到kml图层有诸多限制&#xff0c;比较重要的两点是&#xff1a; 1、不能在三维场景&#xff08;SceneView&#xff09…

【Rust 日报】2023-11-19 solars:可视化太阳系

eyre 0.6.9发布 Eyre是一个可定制的应用程序错误报告库&#xff0c;通过诸如tracing等集成&#xff0c;允许进行可配置的格式化和上下文聚合。本次更新如下。 组织一个由共同决策驱动的异步维护团队。添加一个贡献指南。修复在丢弃已抹除的错误报告时发生的堆叠借用违规。修复由…