简单的描边.ver
不清楚为什么不能加法线,待补充。
Shader "Custom/sd_Silhouette3D"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_NormalMap("Normal Map", 2D) = "white"{}
_DotProduct("Rim effect 边缘效果", Range(0, 1)) = 0.5
}
SubShader
{
Tags
{
"RenderType" = "Transparent"
"IgnoreProjector" = "True"
"Queue" = "Transparent"
}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade nolighting
#pragma target 3.0
sampler2D _MainTex;
sampler2D _NormalMap;
struct Input
{
float2 uv_MainTex;
float2 uv_NormalMap;
float3 worldNormal;
float3 viewDir;
INTERNAL_DATA
};
fixed _DotProduct;
fixed4 _Color;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
//o.Normal = tex2D(_NormalMap, IN.uv_NormalMap);加上后alpha显示失效
float border = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
float alpha = border * (1 - _DotProduct) + _DotProduct;
o.Alpha = c.a * alpha;
}
ENDCG
}
FallBack "Diffuse"
}
波纹噪点.ver
Shader "Custom/sd_Silhouette3D"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_DotProduct("Rim effect 边缘效果", Range(0, 1)) = 0.5
//线条
_LinesMap("线条纹样", 2D) = ""{}
_LinesDensity("线条速度",Range(0, 5)) = 1
//噪声扰动
_NoiseMap("Noise Map", 2D) = ""{}
_NoiseIntensity("Intensity of Noise", Range(0, 0.5)) = 0.2
//发光
_RimPower("Rim Power", Range(0.5, 8.0)) = 3
_RimColor("Rim Color", Color) = (1,1,1,1)
}
SubShader
{
Tags
{
"RenderType" = "Transparent"
"IgnoreProjector" = "True"
"Queue" = "Transparent"
}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade nolighting
#pragma target 4.0
sampler2D _MainTex, _LinesMap;
sampler2D _NoiseMap;
struct Input
{
float2 uv_MainTex;
float2 uv_LinesMap;
float2 uv_NoiseMap;
float3 worldNormal;
float3 viewDir;
INTERNAL_DATA
};
fixed _DotProduct;
fixed4 _Color;
fixed _LinesDensity;
fixed _NoiseIntensity;
fixed _RimPower;
fixed3 _RimColor;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
//噪声-----------------------------------
//使用一张滚动的噪声图
fixed3 noise = tex2D(_NoiseMap, IN.uv_NoiseMap + _Time);
//颜色-----------------------------------
//和课本上的全息内容基本一样,留出一个模型边缘
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
float border = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
float alpha = border * (1 - _DotProduct) + _DotProduct;
o.Albedo = c.rgb;
//纹线------------------------------------
//将滚动的UV转化为世界坐标,不论怎样翻转,纹线干扰波的方向不变,比较符合投影设备逻辑。
fixed scrollLine = _LinesDensity * noise.x *_NoiseIntensity; //噪声使用
fixed3 LineUV = mul(unity_ObjectToWorld, IN.uv_LinesMap + _Time); //转换为世界空间
fixed3 lineMap = tex2D(_LinesMap, LineUV + scrollLine);
//发光------------------------------------
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
//Alpha最终赋值-------------------------------
//纹线的部分镂空处理;将纹线的某个值(反正是黑白的所以只使用了r值)四舍五入取整,
//白色部分和原有的alpha做减法(抠掉)后,再化为0~1范围内的数;0.2为控制图片范围设置的常数
o.Alpha = saturate(c.a * alpha - round(lineMap.r + 0.2));
}
ENDCG
}
FallBack "Diffuse"
}
ENDCG
}
FallBack "Diffuse"
}
加了点bloom以表全息图像边缘的闪烁效果