在unity3D项目中,当选中一个3d模型,需要对其做一个外观的变化,来表现一个交互。
经常是以描边或边缘泛光的形式来处理。
描边的效果经常都是通过两个PASS来实现的,1个输出 沿着法线发现 放大的模型,再统一着色,这个颜色就是描边的颜色。另一个则直接输出。由于第一个沿着法线有做放大,所以就能实现描边的效果。
而边缘泛光则只需要一个PASS解决。当然效果有点区别,这个看需求而定。
思路:核心就是边缘检测,通过视向量和顶点的法向量的点积来实现。当两个向量的夹角越大,越靠近边缘。依赖这个做颜色强度,和纹理颜色做差值运算 就可以了。
没有边缘泛光效果
加上内边缘泛光效果
shader代码:
Shader "JackyShader/OutLineShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_OutLineColor("OutLineShader",Color) = (0.0,0.0,0.0,1.0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert