> 文章列表 > Unity 边缘光

Unity 边缘光

Unity 边缘光

文章目录

  • 边缘光是什么
  • 实现原理
  • 代码

refer:
参考1
参考2

边缘光是什么

边缘光的用处很广泛,比如材质的渲染,云的渲染,角色选中特效等

边缘光也是描边的一种

  • 下面这两张就是添加边缘光后的对比:

在这里插入图片描述

  • 这样的效果在这种玉石里比较合适,有些情况下看着很low:

  • 如果用在比较简单的物体上,看上去就像是背后有打光效果,游戏中其实也常见(用来标记敌人的时候?)

难得直接把效果摆出来。。。如果有人看的话,体验能好点吧,比我之前直接上公式代码要好

实现原理

超级简单:视线V法线N的点积,获得一个值,越靠近边缘越小,用这个值着色就行

  • 很好理解:边缘的地方法线和视线一般是90度的
  • 很想要好效果很挑模型的,如果是比较尖锐的模型,显然效果不会好,适合圆润的模型,内凹的也不适合
  • 其实很像phong,只不过phong是 L ⋅ N L\\cdot N LN
  • 也有点像菲涅尔,但是低配的,反向的

多的不说了,这个太简单,直接看下面的实现

代码

注意事项:

  • 由于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}}
}