使用UnityShader实现外发光效果
实现原理------------------------------------------------------------------------------------
改造外发光shader, 添加透明度混合,输出的透明度为计算出的外发光的透明度
效果展示-------------------------------------------------------------------------------------------------------
Shader "zclShader/X光特性shader"
{
//具有外发光效果
//具有透明效果
Properties
{
_MainTex ("Texture", 2D) = "white" {}
//控制外发光的颜色
_RimColor("_RimColor",Color) = (0,0,0,0)
//控制外发光的范围
_RimPower("_RimPower",Range(1,10)) = 1
//控制外发光的强度
_RimStrength("_RimStrength",Range(1,10)) = 4
}
SubShader
{
Tags {
"RenderType"="Transparent"
"Queue"="Transparent"
}
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 normal:NORMAL; //法线
float3 m_viewDir:TEXCOORD1; //视角向量
float4 col:TEXCOORD2; //视角向量
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _RimColor;
float _RimStrength;
float _RimPower;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.normal = normalize(v.normal);
o.m_viewDir = normalize(ObjSpaceViewDir(v.vertex));
//在顶点中计算,减少性能消耗
float Rim = 1 - saturate(dot(o.normal, o.m_viewDir)); // 1-cos
Rim = pow(Rim, _RimPower); // 1- cos 的 指数
float4 addColor = Rim * _RimColor *_RimStrength;
//边缘光的颜色,边缘光的透明
o.col = float4(_RimColor.rgb, addColor.a);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return i.col;
}
ENDCG
}
}
}
免责声明:图片素材来源于Unity资源商店免费资源包,仅供学习使用
参考资料:https://edu.manew.com/my/course/443/material?type=material
参考书籍:冯乐乐《unityshader入门精要》
参考书籍:郭浩瑜,张鹤《unity3D shaderLab开发实战详解》