Unity Shader unity文档学习笔记(八):边缘光(RimLight)效果

忘记dot的意思可以点这个
在这里插入图片描述


Shader "Unlit/outLine"
{
	//属性
	Properties{
		_RimColor("RimColor", Color) = (1,1,1,1)
		_RimPower("RimPower", Range(1.0, 5.0)) = 1
	}
 
	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }
 
			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _RimColor;
			float _RimPower;
 
			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				//在vertex shader中计算观察方向传递给fragment shader
				float3 worldViewDir : TEXCOORD2;
			};
 
			//定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
			
				o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
				//顶点转化到世界空间
				float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				//可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省
				o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;
				return o;
			}
 
			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
			
				//归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的
				fixed3 worldNormal = normalize(i.worldNormal);
				
				//以下为本篇主题:计算RimLight
				//把视线方向归一化
				float3 worldViewDir = normalize(i.worldViewDir);
				//计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘
				float rim = 1 - saturate(dot(worldViewDir, worldNormal));
				//计算rimLight
				fixed3 rimColor = _RimColor * pow(rim, _RimPower);
				
				return fixed4(rimColor,1);
			}
 
			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	
 
			ENDCG
		}
	}
	//前面的Shader失效的话,使用默认的Diffuse
	FallBack "Diffuse"

}

当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值.)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值