Unity模拟薄膜干涉效果

news2024/11/15 17:29:41

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通道,其实也是可以的,颜色就稍微没那么亮。

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

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

相关文章

win10蓝屏重启故障修复经验分享

1. 安全模式:尝试进入安全模式,按住Shift键并同时点击“重新启动”选项。然后选择“故障排除”>“高级选项”>“启动设置”>“重新启动”。在启动设置页面,按下F4或按4键选择进入安全模式,观察是否仍然出现蓝屏重启问题。…

用平板当电脑副屏(spacedesk)双端分享

文章目录 1.准备工作2.操作流程1. 打开spacedesk点击2. 勾选USB Cable Android3. 用数据线连接移动端和pc端,选择仅充电4. 打开安装好的spacedesk 记得在win系统中设置扩展显示器: 1.准备工作 下载软件spacedesk Driver Console pc端: 移动…

竞赛选题 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 🔥 优质竞赛项目系列,今天要分享的是 行人车辆目标检测计数系统 …

⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ InnoDB存储引擎 ⑩⑧【MySQL】详解InnoDB存储引…

通信网络安全防护定级备案流程介绍(附流程图)

通信网络安全防护定级备案是拥有增值电信业务经营许可证并且有开展电信业务的企业要做的一件事情。刚接触这块的家人们在填报操作的时候可能对具体通信网络安全防护定级备案流程还不是很清楚,所以就给大家画张具体的流程图吧,可以更加直观的了解。 通信…

re 2019安洵杯复现

game 64位elf,ollvm混淆,直接用deflat就能去混淆 展示的是去除之后 arr[ 1,0,5,3,2,7,0,0,8,8,0,9,0,5,0,0,2,0,0,7,0,0,1,0,5,0,3,4,9,0,1,0,0,3,0,0,0,1,0,0,7,0,9,0,6,7,0,3,2,9,0,4,8,0,0,6,0,5,4,0,8,0,9,0,0,4,0,0,1,0,3,0,0,2,1,0,3,0,7,0,4] f…

外观模式 rust和java的实现

外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。 举个例子 :就像电脑的usb接口,自己内部实现了复杂…

【CHI】Ordering保序

本节介绍CHI协议所包含的支持系统保序需求的机制,包括: • Multi-copy atomicity • Completion response and ordering • Completion acknowledgment • Transaction ordering 一、 Multi-copy atomicity CHI协议中所使用的memory model要求为mu…

壹基金宣传进瑞金河背街社区 安全家园项目防灾减灾深入人心

11月16日下午,瑞金赋能公益、蓝天救援队等联合象湖镇河背街社区开展家庭安全计划社区活动包挑战赛活动暨壹基金安全家园项目防灾减灾宣传社区行活动。活动得到了救助儿童会北京代表处、壹基金、艾特公益、益心益意公益的指导,得到了阿里巴巴公益平台广大…

AVL树你需要了解一下

AVL树介绍 AVL树是一种自平衡二叉查找树,它得名于发明者G.M.Adel’son-Vel’skii和E.M.Landis。AVL树的特点是任何节点的两个子树的高度最大差别为1,因此它也被称为高度平衡树。在AVL树中,每个节点的平衡因子只有-1、0、1三种,通…

力扣贪心——跳跃游戏I和II

1 跳跃游戏 利用边界进行判断,核心就是判定边界,边界内所有步数一定是最小的,然后在这个边界里找能到达的最远地方。 1.1 跳跃游戏I class Solution {public boolean canJump(int[] nums) {int len nums.length;int maxDistance 0;int te…

kerberos-MS14-068(kerberos域用户提权)

点击星标,即时接收最新推文 微软官方在2014年11月18日发布了一个紧急补丁,Windows全版本服务器系统受到影响,包括Windows Server 2003,Windows Server 2008,Windows Server 2008 R2,Windows Server 2012和W…

【Windows 常用工具系列 11 -- 福昕PDF搜索高亮过的文本】

文章目录 福昕 PDF 搜索高亮过的文本 福昕 PDF 搜索高亮过的文本 在 pdf 文档阅读过程中,我们需要经常高亮一些文本,以方便下次阅读时找到重点。我这边使用的是 福昕PDF 阅读器,下面就介绍下如何在福昕阅读器中搜索已经高亮过的文本。

html主页框架,前端首页通用架构,layui主页架构框架,首页框架模板

html主页框架 前言功能说明效果使用初始化配置菜单加载主题修改回调 其他非iframe页面内容使用方式iframe页面内容使用方式 前言 这是一个基于layui、jquery实现的html主页架构 平时写的系统后台可以直接套用此框架 由本人整合编写实现,简单上手,完全免…

互联网上门洗衣洗鞋小程序搭建

“闪站侠互联网洗护软件开发”围绕健康洗护、智能操作做出不断升级, 满足用户多样化的洗护需求,打造轻松洗衣洗鞋体验。 洗衣洗鞋专用软件,可以帮助洗衣店洗鞋店店主们省心高效的管理店铺,一次付款长期使用.功能基本涵…

CTF-PWN-小tips

文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …

RoCE、IB和TCP等网络的基本知识及差异对比

目前有三种RDMA网络,分别是Infiniband、RoCE(RDMA over Converged Ethernet)、iWARP。 其中,Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输 ,技术先进,但是成本高昂。 而RoCE 和 iWARP都是基于以太网的…

Java-方法的重写

【1】重写: 发生在子类和父类中,当子类对父类提供的方法不满意的时候,要对父类的方法进行重写。 【2】重写有严格的格式要求: 子类的方法名字和父类必须一致,参数列表(个数,类型&#xff0c…

基于安卓android微信小程序的个人管理小程序

运行环境 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&a…

Ubuntu18.04运行gazebo的launch文件[model-4] process has died报错

启动gazebo仿真环境报错[model-4] process has died [model-4] process has died [pid 2059, exit code 1, cmd /opt/ros/melodic/lib/gazebo_ros/spawn_model -urdf -model mycar -param robot_description __name:model __log:/root/.ros/log/8842dc14-877c-11ee-a9d9-0242a…