菲涅耳内轮廓
使用菲涅耳公式实现内轮廓效果。
菲涅耳简化公式
F
0
为
平
面
的
基
础
反
射
率
,
n
?
为
法
向
量
,
v
?
为
视
角
向
量
。
F
0
+
(
1
?
F
0
)
(
1
?
(
n
?
?
v
?
)
)
5
F_0为平面的基础反射率,\vec{n}为法向量,\vec{v}为视角向量。 \\ F_0+(1?F_0)(1?(\vec{n} \cdot \vec{v}))^5
F0?为平面的基础反射率,n
为法向量,v
为视角向量。F0?+(1?F0?)(1?(n
?v
))5 各个材质对应的反射率如下:
内轮廓改造菲涅耳公式
将
菲
涅
耳
公
式
改
为
:
F
0
+
F
1
?
(
1
?
∣
n
?
?
v
?
∣
)
5
将菲涅耳公式改为:F_0+F_1*(1-|\vec{n} \cdot \vec{v}|)^5
将菲涅耳公式改为:F0?+F1??(1?∣n
?v
∣)5
实现
Shader "Unlit/Fresnel"
{
Properties
{
_FresnelColor ("FresnelColor", Color) = (1, 1, 1, 1)
_FresnelBase ("FresnelBase", Range(0, 1)) = 1
_FresnelScale ("FresnelScale", Range(0, 1)) = 1
_FresnelPower ("FresnelPower", Range(0, 5)) = 5
}
SubShader
{
ZWrite Off
Cull Off
Blend One One
Tags { "RenderType" = "Transparent" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD0;
float3 viewDir : TEXCOORD1;
};
float _FresnelBase;
float _FresnelScale;
float _FresnelPower;
float4 _FresnelColor;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.normal = normalize(UnityObjectToWorldDir(v.normal));
o.viewDir = normalize(UnityWorldSpaceViewDir(mul(unity_ObjectToWorld, v.vertex)));
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return saturate(_FresnelBase + _FresnelScale * pow(1.0 - abs(dot(i.normal, i.viewDir)), _FresnelPower)) * _FresnelColor;
}
ENDCG
}
}
}
效果
|