Shader山下(十三)边缘发光

在很多游戏中,都会让出现模型边缘发光的效果,本文就用表面着色器实现一个简单的边缘发光的效果。

首先我们需要一个最简单的漫反射表面着色器:

Shader "Custom/TestUV" {
	Properties {
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque"}
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}

		ENDCG
	}
	FallBack "Diffuse"
}
Properties里增加:

		_RimColor("Rim Color", Color) = (1,1,1,1)
		_RimPower("Rim Power", Range(0.5,8.0)) = 3.0

SubShader里增加:

	    float4 _RimColor;
		float _RimPower;

一个是边缘发光的颜色,一个是幂。


Input结构里添加视图向量:

	        float3 viewDir;


修改surf方法:

	    void surf (Input IN, inout SurfaceOutput o) {
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
			half rim = 1.0 - abs(dot (normalize(IN.viewDir), o.Normal));
			o.Emission = _RimColor.rgb * pow(rim, _RimPower);
	    }


重点是第四行,首先计算视图向量与法线向量的点积。我们知道点积值在[-1,1]之间,1表示法线与视图同向平行,0表示法线与视图垂直,-1表示法线与视图同向平行。当法线与视图垂直的时候也就意味着像素点平行于视图向量,也就是边缘位置。所以我们取点积的绝对值并用反转,获得rim。rim越大越靠近边缘。

然后根据rim值为像素添加自发光即可。

效果:

Shader山下(十三)边缘发光_第1张图片

Shader山下(十三)边缘发光_第2张图片

你可能感兴趣的:(Shader,Shader山下)