前言
时隔半年再来写shader发现好多东西都忘光了,最近刷短视频看见一个帅气的边缘发光效果,于是想自己也学着写一个,遂找博客学习。发现大佬用的是表面着色器的写法,于是狠狠的恶补了一波表面着色器
表面着色器可以看成是顶点片元着色器的一种抽象。可以更加方便的编写shader,不用再繁杂的编写光照模型。回归正题,边缘发光主要分两步,首先我们要找到模型边缘,让后自发光。第二步可以直接调用属性,所以关键就是第一步
视线与法线的夹角越大说明越靠近边缘,所以用点积来处理
代码
Shader "Custom/MargeLight"
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
[Normal]_NormalMap("Normal Map", 2D) = "bump" {}
_RimColor("Rim Color", Color) = (1, 1, 1, 0)
_RimPower("Rim Power", Range(0.5, 6.0)) = 1.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
float4 _Color;
sampler2D _NormalMap;
float4 _RimColor;
float _RimPower;
struct Input
{
float2 uv_NormalMap;
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutputStandard o)
{
o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
float rim = 1 - saturate(dot(o.Normal, IN.viewDir));
o.Albedo = _Color;
o.Emission = _RimColor * pow(rim, _RimPower);
}
ENDCG
}
FallBack "Diffuse"
}