遇到的问题:
Shader "Custom/s_edge" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_Scale("Scale",range(1,8)) = 2
_Outer("Outer",range(0,1))=0.2
}
SubShader{
Tags{ "queue" = "transparent" }
pass {
blend srcAlpha oneminussrcalpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float _Scale;
float4 _MainColor;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert(appdata_base v) {
v.vertex.xyz += v.normal*0.2;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float3 N = mul(IN.normal,(float3x3)_World2Object);
N = normalize(N);
float3 worldPos = mul(_Object2World,IN.vertex).xyz;
float3 V = _WorldSpaceCameraPos.xyz - worldPos;
V = normalize(V);
//亮度,范围为0~1
float bright = saturate(dot(N,V));
//bright的_Scale次方
bright = pow(bright,_Scale);
//只改变alpha值
_MainColor.a *= bright;
return _MainColor;
}
ENDCG
}
//============================================================================================================================
pass {
blendop revsub
blend dstalpha one
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
return fixed4(1,1,1,1);
}
ENDCG
}
//===========================================================================================================================
}
}
两个pass通道的叠加,视频中的效果是这样的
我运行的效果:
1、实现放大效果
Shader "Custom/s_edge" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_Scale("Scale",range(1,8)) = 2
_Outer("Outer",range(0,1))=0.2
}
SubShader{
Tags{ "queue" = "transparent" }
pass {
blend srcAlpha oneminussrcalpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float _Scale;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert(appdata_base v) {
v.vertex.xyz += v.normal*0.2;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float3 N = mul(IN.normal,(float3x3)_World2Object);
N = normalize(N);
float3 worldPos = mul(_Object2World,IN.vertex).xyz;
float3 V = _WorldSpaceCameraPos.xyz - worldPos;
V = normalize(V);
//亮度,范围为0~1
float bright = 1.0 - saturate(dot(N,V));
//bright的_Scale次方
bright = pow(bright,_Scale);
return fixed4(1,1,1,1)*bright;
}
ENDCG
}
}
}
2、亮度向外衰减,去掉1.0-这两个符号
Shader "Custom/s_edge" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_Scale("Scale",range(1,8)) = 2
_Outer("Outer",range(0,1))=0.2
}
SubShader{
Tags{ "queue" = "transparent" }
pass {
blend srcAlpha oneminussrcalpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float _Scale;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert(appdata_base v) {
v.vertex.xyz += v.normal*0.2;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float3 N = mul(IN.normal,(float3x3)_World2Object);
N = normalize(N);
float3 worldPos = mul(_Object2World,IN.vertex).xyz;
float3 V = _WorldSpaceCameraPos.xyz - worldPos;
V = normalize(V);
//亮度,范围为0~1
float bright = saturate(dot(N,V));
//bright的_Scale次方
bright = pow(bright,_Scale);
return fixed4(1,1,1,1)*bright;
}
ENDCG
}
}
}
3、上图中最边缘部分变成了黑色。原因是bright = pow(bright,_Scale)这个值有可能为0,颜色部分fixed4(1,1,1,1)*bright任何值与0相乘都有可能是黑色,实际上只需要将alpha值相乘就可以了
Shader "Custom/s_edge" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_Scale("Scale",range(1,8)) = 2
_Outer("Outer",range(0,1))=0.2
}
SubShader{
Tags{ "queue" = "transparent" }
pass {
blend srcAlpha oneminussrcalpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float _Scale;
float4 _MainColor;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert(appdata_base v) {
v.vertex.xyz += v.normal*0.2;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float3 N = mul(IN.normal,(float3x3)_World2Object);
N = normalize(N);
float3 worldPos = mul(_Object2World,IN.vertex).xyz;
float3 V = _WorldSpaceCameraPos.xyz - worldPos;
V = normalize(V);
//亮度,范围为0~1
float bright = saturate(dot(N,V));
//bright的_Scale次方
bright = pow(bright,_Scale);
//只改变alpha值
_MainColor.a *= bright;
return _MainColor;
}
ENDCG
}
}
}
4、两个通道叠加
Shader "Custom/s_edge" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_Scale("Scale",range(1,8)) = 2
_Outer("Outer",range(0,1))=0.2
}
SubShader{
Tags{ "queue" = "transparent" }
pass {
blend srcAlpha oneminussrcalpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float _Scale;
float4 _MainColor;
float _Outer;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert(appdata_base v) {
v.vertex.xyz += v.normal*0.2;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
float3 N = mul(IN.normal,(float3x3)_World2Object);
N = normalize(N);
float3 worldPos = mul(_Object2World,IN.vertex).xyz;
float3 V = _WorldSpaceCameraPos.xyz - worldPos;
V = normalize(V);
//亮度,范围为0~1
float bright = saturate(dot(N,V));
//bright的_Scale次方
bright = pow(bright,_Scale);
//只改变alpha值
_MainColor.a *= bright;
return _MainColor;
}
ENDCG
}
//============================================================================================================================
pass {
blendop revsub
blend dstalpha one
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
return fixed4(1,1,1,1);
}
ENDCG
}
//===========================================================================================================================
}
}