Shader-(顶点实现)漫反射相关;自定义颜色

  • 漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) )  点积cosθ = 光方向· 法线方向    //max表示小于0时取最大值0
  • 只有定义了正确的LightMode才能得到一些Unity的内置光照变量    Tags{ "LightMode"="ForwardBase" }
  • 包含unity的内置的文件,才可以使用unity内置的一些变量                #include "Lighting.cginc"
  • normalize()       用来把一个向量,单位化(原来方向保持不变,长度变为1)
  • max()                用来取得函数中最大的一个
  • dot                    用来取得两个向量的点积
  • _WorldSpaceLightPos0      取得平行光的位置
  • _LightColor0                         取得平行光的颜色
  • UNITY_MATRIX_MVP         这个矩阵用来把一个坐标从模型空间转换到剪裁空间
  • _World2Object                     这个矩阵用来把一个方向从世界空间转换到模型空间
  • mul(_World2Object, v.normal);         从世界空间转换到模型空间
  • mul(v.normal, _World2Object);         从模型空间转换到世界空间
  • UNITY_LIGHTMODEL_AMBIENT   用来获取环境光
  • // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
    
    Shader "LXC/04 Diffuse"
    {
    	SubShader
    	{
    		Pass{
    		Tags{"LightMode"="ForwardBase"}
    		CGPROGRAM
    #include "Lighting.cginc"
    #pragma vertex vert		
    #pragma fragment frag
    
    		struct a2v {	
    		float4 vertex:POSITION;	
    		float3 normal:NORMAL;
    		};
    		
    		struct v2f {
    		float4 position:SV_POSITION;	
    		fixed3 color : COLOR;
    		};
    			
    		v2f vert(a2v v) {
    			v2f f;
    			f.position = UnityObjectToClipPos(v.vertex);
    			fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));	//从模型空间到世界空间
    			fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);					//第一个直射光的位置 _WorldSpaceLightPos0,对于每个顶点来说,光的位置就是光的方向
    			//取得漫反射的颜色
    			fixed3 diffuse = _LightColor0.rgb * max (dot(normalDir,lightDir),0);	//获取第一个直射光的颜色 _LightColor0在#include "Lighting.cginc"里
    			f.color = diffuse;
    			return f;
    		}
    
    
    		fixed4 frag(v2f f) :SV_Target{
    		return fixed4(f.color,1);
    	}
    		ENDCG
    	}
    	}
    		Fallback "VertexLit"
    }
  • 自定义颜色

    // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
    
    Shader "LXC/04p Diffuse"
    {
    	Properties{
    		_Diffuse("Diffuse Color",Color) = (1,1,1,1)	//定义一个颜色属性
    	}
    		SubShader
    	{
    		Pass{
    		Tags{ "LightMode" = "ForwardBase" }
    		CGPROGRAM
    #include "Lighting.cginc"
    #pragma vertex vert		
    #pragma fragment frag
    		fixed4 _Diffuse;	//需要重新定义一下属性才可以使用
    
    		struct a2v {
    		float4 vertex:POSITION;
    		float3 normal:NORMAL;
    	};
    
    	struct v2f {
    		float4 position:SV_POSITION;
    		fixed3 color : COLOR;
    	};
    
    	v2f vert(a2v v) {
    		v2f f;
    		f.position = UnityObjectToClipPos(v.vertex);
    		fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));	
    		fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);					
    		fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;	//两个颜色相乘就是融合
    		f.color = diffuse;
    		return f;
    	}
    
    
    	fixed4 frag(v2f f) :SV_Target{
    		return fixed4(f.color,1);
    	}
    		ENDCG
    	}
    	}
    		Fallback "VertexLit"
    }

猜你喜欢

转载自blog.csdn.net/qq_42459006/article/details/84108834