半透明边缘光效果
原理
整个效果分为两部分,一个是半透明效果另一个是边缘发光,对于第一个效果来说我们只需要使用透明度混合的方法就可以办到,第二个效果的关键在于怎么辨别边缘?
我们可以用法线向量点乘视线向量来辨别.
代码
float4 _Color;
float _Emiss;
float _RimPower;
v2f vert(a2v v)
{
v2f ans;
ans.pos = UnityObjectToClipPos(v.vertex);
ans.view_World = _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz;
ans.normal_World = UnityObjectToWorldNormal(v.normal);
return ans;
}
float4 frag(v2f res) : SV_Target
{
float3 normal_World = normalize(res.normal_World);
float3 view_World = normalize(res.view_World);
float NdotV = dot(normal_World, view_World);
float rim = pow(1 - NdotV, _RimPower); // cos在[0, pi / 2]是单调递减,所以反一下
float3 color = _Color.xyz * _Emiss;
float alpha = saturate(rim * _Emiss); // 越靠近边缘rim越大,alpha越大,显色越明显
return float4(color, alpha);
}
效果
透明流光效果
原理
透明光效果和上面的是一样的,流光效果的话只要在用uv进行采样的时候添加Time就可以了,因为加入Time变量之后每次采样的uv坐标都会边然后就会导致一个点的颜色随着Time的变化而变化,从而达到流光的效果。如果直接用模型的uv会导致整个效果像是贴在模型上一样不自然也不好看,所以我们可以使用顶点的世界坐标的xy平面坐标作为uv来采样。但是这样也有个问题就是当模型移动时流光会跟着动,故我们要将世界坐标减去模型坐标的原点(世界坐标下)