Unity Shader学习记录第一章

学习对象为大神冯乐乐的CSDN

本节主要学习了

属性 Properties

三种自定义光照模型函数

漫反射光照模型

半兰伯特光照模型

渐变图实现双向反射分布优化的光照模型

tex2D函数 dot函数等

代码记录如下

```csharp
Shader "Unlit/BasicDiffuse"
{
	Properties
	{
		_MainTex("texture",2D)="white"{}
		_RampTex("_RampTex",2D)="white"{}
		_EmissiveColor("EmissiveColor",COLOR)=(1,1,1,1)
		_AmbientColor("AmbientColor",COLOR)=(1,1,1,1)
		_MySliderValue("This is a Slider",Range(0,10))=2.5
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		CGPROGRAM
		//#pragma surface surf Lambert
		#pragma surface surf BasicDiffuse_BRDF
		sampler2D _MainTex;
		sampler2D _RampTex;
		//每再属性 Properties中声明一个变量时,需要再CGPROGAM中声明一个和Properties中名称相同的变量,这将建立一个链接,两者将操作同一个数据
		//
		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _MySliderValue;

		//自定义光照模型
		//名称命名为 Lighting<自定义的光照模型的名称>
		//有三种可供选择的光照模型函数
		//half4 LightingName(SurfaceOutput s,half3 lightDir,half atten){}  -这个函数被用于forward rendering(正向渲染),但是不需要考虑view direction(观察角度)时。
		//half4 LightingName(SurfaceOutput s,half3 lightDir,half3 viewDir,  half atten){}  -这个函数被用于forward rendering(正向渲染),需要考虑view direction(观察角度)时。
		//half4 LightingName_PrePass (SurfaceOutput s, half4 light){}  -这个函数被用于需要使用defferred rendering(延迟渲染)时。
		inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)
		{
			//计算到达该点的光照值   dot返回的结果相当于到达该点入射光的余弦值  角度越大,值越小,进入人眼光照越少,物体看起来越暗
			//max函数放置,光照从相反方向射入时,会出现非预期的效果,比如全黑,所以使用max 函数确保光照值不是非预期效果
			float difLight=max(0,dot(s.Normal,lightDir));

			//半兰伯特光照模型  使光照值从0-1.0  变为0.5-1.0 是物体更亮
			float hLambert=difLight*0.5+0.5;

			//使用渐变图控制控制漫反射光照的颜色
			float2 tempRamp=(hLambert,hLambert);
			float3 ramp=tex2D(_RampTex, tempRamp).rgb;
			
			
			float4 col;
			//计算颜色值COL
			//颜色值的rgb由三部分计算得到:
			//							一。s的反射率  反射率越大,进入人眼光线越多,颜色越鲜亮
			//							二。LightColor0.rgb   _LightColor0是unity内置变量,我们可以使用它得到场景中光源的颜色
			//							三。最后一个是得到得到的该点的光照值和衰减率的乘积  后面的乘2根据效果自行修改,乘2时光照会更鲜艳

			col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
			col.a=s.Alpha;
			return col;
		}


		//自动逸光照模型
		//这个自定义光照将使用双向反射分布函数
		//即考虑观察值的正向渲染
		//新增加参数viewDir   这个参数将由unity 内部提供,来得到当前的观察点位置到观察点的方向向量
		inline float4 LightingBasicDiffuse_BRDF(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
		{
			//计算到达该点的光照值   dot返回的结果相当于到达该点入射光的余弦值  角度越大,值越小,进入人眼光照越少,物体看起来越暗
			//max函数放置,光照从相反方向射入时,会出现非预期的效果,比如全黑,所以使用max 函数确保光照值不是非预期效果
			//float difLight=max(0,dot(s.Normal,lightDir));
			//将上面求光照点的两个夹角后面的光照改为veiweDir
			float difLight=max(0,dot(s.Normal,viewDir));

			//半兰伯特光照模型  使光照值从0-1.0  变为0.5-1.0 是物体更亮
			float hLambert=difLight*0.5+0.5;

			//使用渐变图控制控制漫反射光照的颜色
			float2 tempRamp=(hLambert,hLambert);
			float3 ramp=tex2D(_RampTex, tempRamp).rgb;
			
			
			float4 col;
			//计算颜色值COL
			//颜色值的rgb由三部分计算得到:
			//							一。s的反射率  反射率越大,进入人眼光线越多,颜色越鲜亮
			//							二。LightColor0.rgb   _LightColor0是unity内置变量,我们可以使用它得到场景中光源的颜色
			//							三。最后一个是得到得到的该点的光照值和衰减率的乘积  后面的乘2根据效果自行修改,乘2时光照会更鲜艳

			col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
			col.a=s.Alpha;
			return col;
		}

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
			half4 c = tex2D (_MainTex, IN.uv_MainTex);
			//float4 c;
			//c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值