薄膜干涉效果

薄膜干涉效果

一月 22, 2022

薄膜干涉

材质捕捉效果(Material Capture)

预览效果

预览效果

ASE图

在这里插入图片描述

原理

将观察坐标系的顶点法线xy当作材质的uv,将材质图片根据坐标平埔视角坐标系下的模型上,缺点当模型处于视野边缘时会有破绽。

代码

Properties

1
2
3
4
5
6
_MainTex ("diffuse", 2D) = "white" {}
_MatCatAddTex ("MatCatAdd", 2D) = "white" {}
_MatCatAddIntensity ("MatCatAddIntensity", Float) = 0.35

_MatCatTex ("MatCat", 2D) = "white" {}
_MatCatIntensity ("MatCatIntensity", Float) = 5.0

Pass

1
2
3
4
5
6
7
8
sampler2D _MatCatAddTex;
float4 _MatCatAddTex_ST;
float _MatCatAddIntensity;


sampler2D _MatCatTex;
float4 _MatCatTex_ST;
float _MatCatIntensity;

vert

1
o.normal_world = mul(float4(v.normal,0.0) ,unity_WorldToObject);//获取worldnormal

frag

1
2
3
4
fixed4 col_diffuse = tex2D(_MainTex, i.uv);
half2 MatCat_uv = (mul(UNITY_MATRIX_V, half4(normal_world, 0.0)).xy + 1.0f) * 0.5f;
fixed4 col_MatCatAdd = tex2D(_MatCatAddTex, MatCat_uv) * _MatCatAddIntensity;
fixed4 col_MatCat = tex2D(_MatCatTex, MatCat_uv) * _MatCatIntensity;

Ramp填充里面的颜色

预览效果

在这里插入图片描述

过度颜色图

在这里插入图片描述

ASE图

在这里插入图片描述

原理

利用菲涅尔方程的经验,1.0f - saturate(dot(normal_world, view_dir))在x和y上得到的是单调连续数值

代码

Properties

1
_RampTex("Ramp", 2D) = "white" {}

vart

1
2
float3 pos_world = mul(unity_ObjectToWorld, v.vertex);
o.view_world = normalize( _WorldSpaceCameraPos - pos_world );

frag

1
2
3
half3 view_dir = normalize(i.view_world);
half fresnel = 1.0f - saturate(dot(normal_world, view_dir));
fixed4 col_Ramp = tex2D(_RampTex, half2(fresnel, 0.5f));

合并效果

最终效果

在这里插入图片描述

在这里插入图片描述

ASE图

在这里插入图片描述

总代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Shader "Unlit/MatCat1_Code"
{
Properties
{
_MainTex ("diffuse", 2D) = "white" {}
_MatCatAddTex ("MatCatAdd", 2D) = "white" {}
_MatCatAddIntensity ("MatCatAddIntensity", Float) = 0.35

_MatCatTex ("MatCat", 2D) = "white" {}
_MatCatIntensity ("MatCatIntensity", Float) = 5.0
_RampTex("Ramp", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag


#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};

struct v2f
{
float2 uv : TEXCOORD0;
float3 normal_world : TEXCOORD1;
float3 view_world : TEXCOORD2;
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;

sampler2D _MatCatAddTex;
float4 _MatCatAddTex_ST;
float _MatCatAddIntensity;


sampler2D _MatCatTex;
float4 _MatCatTex_ST;
float _MatCatIntensity;

sampler2D _RampTex;
float4 _RampTex_ST;


v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);

o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.normal_world = mul(float4(v.normal,0.0) ,unity_WorldToObject);
float3 pos_world = mul(unity_ObjectToWorld, v.vertex);
o.view_world = normalize( _WorldSpaceCameraPos - pos_world );
return o;
}

fixed4 frag(v2f i) : SV_Target
{
half3 normal_world = normalize(i.normal_world);
fixed4 col;
// MatCap
fixed4 col_diffuse = tex2D(_MainTex, i.uv);
half2 MatCat_uv = (mul(UNITY_MATRIX_V, half4(normal_world, 0.0)).xy + 1.0f) * 0.5f;
fixed4 col_MatCatAdd = tex2D(_MatCatAddTex, MatCat_uv) * _MatCatAddIntensity;
fixed4 col_MatCat = tex2D(_MatCatTex, MatCat_uv) * _MatCatIntensity;


//Ramp
half3 view_dir = normalize(i.view_world);
half fresnel = 1.0f - saturate(dot(normal_world, view_dir));
fixed4 col_Ramp = tex2D(_RampTex, half2(fresnel, 0.5f));

col = col_diffuse * col_MatCat * col_Ramp;
col += col_MatCatAdd ;


// return fixed4(i.normal_world,0.0);
return col;
}
ENDCG
}
}
}