Unity 基础光照模型

Shader "Unlit/NewUnlitShader"
{
 Properties
	{
        _Color("color1",Color)=(1,1,0,1)
		_BaseMap("Base Map",2D)="white" {}
		_Shininess("shininess",float)=32
	

	
    	
	
	}
	
	SubShader
	{
		Pass //pass可以用多个pass
		{
	     HLSLPROGRAM //HLSL可以进行替换替换成GLSL

		#pragma vertex Vertex    //声明函数 //顶点着色器
		#pragma fragment Pixel   //片段着色器 像素着色器

	     half4 _Color;//声明变量
	     sampler2D _BaseMap;
	     float _Shininess;
	     

	     
	     //model将物体的局部空间变换到世界空间
	     //view 通过摄像机的变化矩阵从世界空间变换到摄像机的空间中
	     //projection 投影变换变换到屏幕空间

	     #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
	     
	     #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

        struct Attributes
        {
        	float4 vertex:POSITION;
        	float2  uv : TEXCOORD0;
         	float3  normal: NORMAL;
      
	        
        };

	      struct Varyings
        {
        	float4 positionCS:SV_POSITION;
        	float2  uv : TEXCOORD0;
	      	float3  normalWS: NORMAL;//法线向量是一个float3
	        float3  positionWS : TEXCOORD1;//定义一个世界空间位置
        };
	     
	  
	     Varyings Vertex(Attributes IN)  //顶点着色器 float4输入的变量类型 vertex变量名字
	     //:后面说的是顶点着色器关联的裁切空间位置 SV含义为system value系统中的值
		{
            Varyings OUT;
	    	//IN.uv=IN.uv*_CosTime; //UV随时间变化
			
			OUT.positionCS=TransformObjectToHClip(IN.vertex.xyz);
	     	OUT.normalWS=TransformObjectToWorld(IN.normal);//这里是直接用的URP里的TransformObjectToWorld
	     	OUT.positionWS=mul(UNITY_MATRIX_M,float4(IN.vertex.xyz,1.0));
	     	OUT.uv=IN.uv;//如果你不需要UV进行改变就用输入进来的uv
	     	//可以省略法线变换矩阵 因为法线会因为缩放而变化所以法线变化矩阵尤其重要
			
            return OUT;
	    }
	     
	     

	     //lambert光照模型只有环境光照和漫反射
	     //phong模型多了一个高光
		half4 Pixel(Varyings IN) : SV_TARGET //SV含义为system value
	     //SV_TARGET表示最后输出一个像素颜色
	    {
	    	half4 color;
	    	Light lighting=GetMainLight();//也可以通过这个函数直接获取光线的信息
	    	float3 normal=normalize(IN.normalWS);
	    	float3 viewDir=-normalize(_WorldSpaceCameraPos.xyz-normal);
	    	float3 reflDir=reflect(lighting.direction,normal);
	    	half3 ambient =SampleSH(normal)*0.02;//这个SampleSH球谐函数可以采样到周围的环境信息
	    	float diffuse=max(0,dot(normal,lighting.direction));//直接通过lighting函数获取平行光 和光线颜色
	    	//float3 normalWS=normalize(IN.normalWS);//获取法线位置
	    	//float3 diffuse=max(0,dot(normalWS,_MainLightPosition.xyz));//_MainLightPosition获取灯光的位置,我们知道两个单位向量的夹角越小,它们点乘的结果越倾向于1,受到光照影响越大
            float3 spec=max(0,dot(viewDir,reflDir));
        	spec=pow(spec,32);
	    

	    	
	    	color.rgb=tex2D(_BaseMap,IN.uv).rgb*_Color*diffuse*lighting.color.rgb+ambient+spec;
	    	color.a=1.0;
	    	return color;
	    }
		ENDHLSL
	    }
	
	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值