Fragment shader---边缘泛光2

遇到的问题:

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通道的叠加,视频中的效果是这样的


我运行的效果:



调整Outer和Scale之后稍微有了点儿形状



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
	}


	//===========================================================================================================================
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值