- 漫反射 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" }
Shader-(顶点实现)漫反射相关;自定义颜色
猜你喜欢
转载自blog.csdn.net/qq_42459006/article/details/84108834
今日推荐
周排行