Unity 边缘光
文章目录
- 边缘光是什么
- 实现原理
- 代码
refer:
参考1
参考2
边缘光是什么
边缘光的用处很广泛,比如材质的渲染,云的渲染,角色选中特效等
边缘光也是描边的一种
- 下面这两张就是添加边缘光后的对比:
-
这样的效果在这种玉石里比较合适,有些情况下看着很low:
-
如果用在比较简单的物体上,看上去就像是背后有打光效果,游戏中其实也常见(用来标记敌人的时候?)
难得直接把效果摆出来。。。如果有人看的话,体验能好点吧,比我之前直接上公式代码要好
实现原理
超级简单:视线V和法线N的点积,获得一个值,越靠近边缘越小,用这个值着色就行
- 很好理解:边缘的地方法线和视线一般是90度的
- 很想要好效果很挑模型的,如果是比较尖锐的模型,显然效果不会好,适合圆润的模型,内凹的也不适合
- 其实很像phong,只不过phong是 L ⋅ N L\\cdot N L⋅N
- 也有点像菲涅尔,但是低配的,反向的
多的不说了,这个太简单,直接看下面的实现
代码
注意事项:
- 由于V会变化,导致边缘光也会变化,不只角度,前后距离也会改变效果(越近范围越大)
- 其实有很多玩法的:
1) 比如低配菲涅尔(1.0 - edge
)(但是变化距离会穿帮)(菲涅尔的结果比这个漂亮多了)
2) 对点积结果再来一次映射(pow(edge, 5)
)
Shader "Unlit/edge_light"
{SubShader{Tags { "RenderType"="Opaque" }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 : NORMAL;float3 V : TEXCOORD0;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.V = WorldSpaceViewDir(v.vertex);o.normal = v.normal;return o;}fixed4 frag (v2f i) : SV_Target{//也就这里一步,好简单float edge = 1.0- dot(i.normal, i.V);//缩窄范围:float edge =pow(1.0- dot(i.normal, i.V), 5);//规范一点还要:saturate(dot)fixed4 col = fixed4(1,1,1,1)*edge;return col;}ENDCG}}
}