UnityShader高光反射及简单实现

Phong的定义:
在这里插入图片描述
Blinn-Phong的定义:
在这里插入图片描述

Shader "ShaderPath/SpecularShader"//shader的选择路径
{
	Properties//该Shader可控的属性
	{
		_DiffuseColor ("DiffuseColor",Color) = (1,1,1,1)//漫反射的主色调
		_SpecularColor ("SpecularColor",Color) = (1,1,1,1)//高光反射的主色调
		_Gloss ("Gloss",Range(1,100)) = 2 //光泽度(反光度) 控制高光区域的大小
	}
	SubShader//子着色器
	{
		// 以下均为默认值,详情可查看以往博客
		Cull Back ZWrite On ZTest LEqual

		Pass
		{
			Tags {"LightMode"="ForwardBase"} 
			//与ENDCG相照应,将CG代码包裹
			CGPROGRAM
			//顶点函数定义
			#pragma vertex diffusevert  
			//片元函数定义
			#pragma fragment diffusefrag
			//引入必要的Unity库 如下面的UnityObjectToClipPos 就是库中函数
			#include "UnityCG.cginc"
			//引入光照库 _LightColor0需要用
			#include "Lighting.cginc"
			struct appdata
			{
				float4 vertex : POSITION;//每个顶点结构体必须有的
				float3 normal : NORMAL;//定义法线
			};

			struct v2f
			{
				fixed3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float4 pos : SV_POSITION;//每个片元结构体必须有的
			};
			
			fixed4 _DiffuseColor;
			fixed4 _SpecularColor;
			float _Gloss;


			v2f diffusevert (appdata v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);//把顶点从模型空间转换到剪裁空间
				o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));//把法线从模型空间转换到世界空间
				o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;//模型坐标转到世界坐标
				return o;
			}
			
			fixed4 diffusefrag (v2f i) : SV_Target//返回一个RGBA到模型上
			{
				fixed3 lightDir = UnityWorldSpaceLightDir(i.worldPos);//获取光源在世界空间下的方向(光源发射出来的方向)
				fixed3 diffuse = _LightColor0.rgb * _DiffuseColor * (1+dot(lightDir,i.worldNormal))/2;
				fixed3 reflectDir = normalize(reflect(-lightDir,i.worldNormal));//计算反射光线,-lightDir光线方向应是从模型射向光源正好反向
				fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);//计算眼睛的方向 相机位置-模型的世界坐标 向量
				//_LightColor0.rgb 光源的RGB值
				//Phong模型高光 pow(saturate(dot(reflectDir,viewDir)),_Gloss)
				//Blinn-Phong模型高光 
				fixed3 halfView = normalize(lightDir + viewDir);
				fixed3 specular = _LightColor0.rgb * _SpecularColor * pow(saturate(dot(i.worldNormal,halfView)),_Gloss);
				return fixed4(diffuse + specular,1);
			}
			ENDCG
		}
	}
}

效果图如下:
在这里插入图片描述

PS.如果是在Scene下查看,当进入相机的范围之后,光照的方向会反向(猜测是_WorldSpaceCameraPos造成的)
反向的原因是没有在Pass 里面定义 Tags {“LightMode”=“ForwardBase”}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值