shader 讲解的第二天 把兰伯特模型改成半兰泊特模型 函数图形绘制工具
1 Shader "Shader5" //名称和路径 2 { 3 Properties//属性 4 { 5 _Color("_Color",Color)=(1,1,1,1) 6 //变量名 标签 类型 初始值 7 _Vector("_Vector",Vector)=(1,2,3,4) 8 _int("_Int",int)=100 9 _float("Float",float)=3.14 10 _Range("Range",Range(1,10))=6 11 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{} 13 } 14 SubShader//可以有很多个 显卡运行时 从第一个开始运行 15 { 16 Pass //Pass块相当于一个方法 至少有一个Pass 17 { 18 CGPROGRAM 19 //在CG中重新定义变量 20 fixed4 _Color; 21 float4 _Vector; 22 float _int; 23 float _float; 24 float _Range; 25 sampler2D _2D; 26 sampler3D _3D; 27 #pragma vertex vert //声明顶点函数 28 #pragma fragment frag //声明片元函数 29 #include "Lighting.cginc"//获取第一个直射光 30 struct a2v 31 { 32 float4 vectex:POSITION; 33 float3 normal:NORMAL; 34 }; 35 struct v2f 36 { 37 float4 position:SV_POSITION; 38 fixed3 color:COLOR; 39 40 }; 41 v2f vert(a2v v) 42 { 43 v2f f; 44 f.position=UnityObjectToClipPos(v.vectex); 45 46 //_WorldSpaceLightPos0.xyz 获取光的方向 47 f.color=UnityObjectToWorldNormal(v.normal); 48 return f; 49 } 50 fixed4 frag(v2f f):SV_Target 51 { 52 fixed3 normalDir=f.color; 53 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 54 //fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir))*_Color.rgb; 55 fixed3 halfLambert=dot(lightDir,normalDir)*0.5+0.5*_Color.rgb; 56 fixed3 envoment=UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光 57 fixed3 tempColor=halfLambert+envoment; 58 return fixed4(tempColor,1); 59 } 60 ENDCG 61 } 62 } 63 64 }
1 Shader "Shader6" //名称和路径 2 { 3 Properties//属性 4 { 5 _Color("_Color",Color)=(1,1,1,1) 6 //变量名 标签 类型 初始值 7 _Vector("_Vector",Vector)=(1,2,3,4) 8 _int("_Int",int)=100 9 _float("Float",float)=3.14 10 _Range("Range",Range(10,50))=10 11 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{} 13 } 14 SubShader//可以有很多个 显卡运行时 从第一个开始运行 15 { 16 Pass //Pass块相当于一个方法 至少有一个Pass 17 { 18 CGPROGRAM 19 //在CG中重新定义变量 20 fixed4 _Color; 21 float4 _Vector; 22 float _int; 23 float _float; 24 float _Range; 25 sampler2D _2D; 26 sampler3D _3D; 27 #pragma vertex vert //声明顶点函数 28 #pragma fragment frag //声明片元函数 29 #include "Lighting.cginc"//获取第一个直射光 30 struct a2v 31 { 32 float4 vectex:POSITION; 33 float3 normal:NORMAL; 34 }; 35 struct v2f 36 { 37 float4 position:SV_POSITION; 38 fixed3 color:COLOR; 39 }; 40 v2f vert(a2v v) 41 { 42 v2f f; 43 f.position=UnityObjectToClipPos(v.vectex); 44 //_WorldSpaceLightPos0.xyz 获取光的方向 45 fixed3 normalDir=UnityObjectToWorldNormal(v.normal); 46 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 47 fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir))*_Color.rgb; 48 fixed3 envoment=UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光 49 50 fixed3 reflectDir=normalize(reflect(-lightDir,normalDir));//反射光的方向; 51 52 fixed3 vivewDir=normalize(_WorldSpaceCameraPos.xyz-mul(v.vectex,unity_WorldToObject).xyz);//视野方向 53 54 fixed3 specularDir=_LightColor0.rgb*pow(max(dot(reflectDir,vivewDir),0),_Range); 55 f.color=diffuse+envoment+specularDir; 56 return f; 57 } 58 fixed4 frag(v2f f):SV_Target 59 { 60 return fixed4(f.color,1); 61 } 62 ENDCG 63 } 64 } 65 66 }
1 Shader "Shader7" //名称和路径 2 { 3 Properties//属性 4 { 5 _Color("_Color",Color)=(1,1,1,1) 6 //变量名 标签 类型 初始值 7 _Vector("_Vector",Vector)=(1,2,3,4) 8 _int("_Int",int)=100 9 _float("Float",float)=3.14 10 _Range("Range",Range(10,50))=10 11 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{} 13 } 14 SubShader//可以有很多个 显卡运行时 从第一个开始运行 15 { 16 Pass //Pass块相当于一个方法 至少有一个Pass 17 { 18 CGPROGRAM 19 //在CG中重新定义变量 20 fixed4 _Color; 21 float4 _Vector; 22 float _int; 23 float _float; 24 float _Range; 25 sampler2D _2D; 26 sampler3D _3D; 27 #pragma vertex vert //声明顶点函数 28 #pragma fragment frag //声明片元函数 29 #include "Lighting.cginc"//获取第一个直射光 30 struct a2v 31 { 32 float4 vectex:POSITION; 33 float3 normal:NORMAL; 34 }; 35 struct v2f 36 { 37 float4 position:SV_POSITION; 38 float3 worldNormal:TEXCOORD0; 39 float3 worldVertex:TEXCOORD1; 40 41 }; 42 v2f vert(a2v v) 43 { 44 v2f f; 45 f.position=UnityObjectToClipPos(v.vectex); 46 47 //_WorldSpaceLightPos0.xyz 获取光的方向 48 f.worldNormal=UnityObjectToWorldNormal(v.normal); 49 f.worldVertex=mul(v.vectex,unity_WorldToObject).xyz; 50 return f; 51 } 52 fixed4 frag(v2f f):SV_Target 53 { 54 fixed3 normalDir=f.worldNormal; 55 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 56 fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir))*_Color.rgb; 57 fixed3 envoment=UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光 58 59 fixed3 reflectDir=normalize(reflect(-lightDir,normalDir));//反射光的方向; 60 61 fixed3 vivewDir=normalize(_WorldSpaceCameraPos.xyz-f.worldVertex);//视野方向 62 fixed3 specularDir=_LightColor0.rgb*pow(max(dot(reflectDir,vivewDir),0),_Range); 63 fixed3 tempColor=diffuse+envoment+specularDir; 64 return fixed4(tempColor,1); 65 } 66 ENDCG 67 } 68 } 69 70 }
一、把兰伯特模型改成半兰泊特模型
昨天的兰伯特是cos(x):
数学公式:
优化数学公式:不让它为负数;:
dot就是cos函数
给它加一个颜色:
效果:
二、
高光反射:
cos x 中的x是反射光与视野方向 的夹角;
max:如果 cosx是负数 就去0,
pow:代表前边的高光参数的次方 是几就是几次方
图形:
步骤:
先在顶点函数里面实现:
1.获取反射光的方向:找入射光的方向和法线的方向
用是shader3里的拿来做shader6::没有加代码的时候
通过reflect(入射光取负方向,法线)
得到反射光方向:
获取视野的方向。得先获得相机的方向:相机位置点减去反射点的位置
——————》相机位置
把所有的点找到,这是自身的点,转换才成世界坐标的点-》
向量化后接受:这儿就是套用公式:
————————————————————————————————————————
放片元函数里看效果 从第4个脚本复制来修改:
1.法线和入射光的方向
世界坐标的法线,世界坐标的所有顶点坐标:
所有焦点坐标转换为世界坐标
计算视野方向与反射光的方向: