自制简单的Lambert光照

Shader "浅墨Shader编程/Volume7/35.自制简单的Lambert光照" 
{
	//--------------------------------【属性】----------------------------------------  
	Properties 
	{
      _MainTex ("【主纹理】Texture", 2D) = "white" {}
    }

	//--------------------------------【子着色器】----------------------------------  
    SubShader 
	{
		//-----------子着色器标签----------  
		Tags { "RenderType" = "Opaque" }
		//-------------------开始CG着色器编程语言段-----------------   
		CGPROGRAM

		//【1】光照模式声明:使用自制的兰伯特光照模式
		#pragma surface surf QianMoLambert

		//【2】实现自定义的兰伯特光照模式
		half4 LightingQianMoLambert (SurfaceOutput s, half3 lightDir, half atten) 
		{
			half NdotL =max(0, dot (s.Normal, lightDir));
			half4 color;
			color.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten * 2);
			color.a = s.Alpha;
			return color;
		}

		//【3】输入结构  
		struct Input 
		{
			float2 uv_MainTex;
		};

		//变量声明
		sampler2D _MainTex;

		//【4】表面着色函数的编写
		void surf (Input IN, inout SurfaceOutput o) 
		{
			//从主纹理获取rgb颜色值 
			o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
		}

		//-------------------结束CG着色器编程语言段------------------
		ENDCG
    }
    Fallback "Diffuse"
  }

_LightColor0 存储了该逐像素光的颜色

还有个_WorldSpaceLightPos0,里面存储的其实就是平行光的方向,_WorldSpaceLightPos0.w可以表明该光源的类型,如果为0表示是平行光,为1表示是点光源或者聚光灯光源

你可能感兴趣的:(一天一个shader)