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 }
shader5
 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 }
shader6
 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 }
shader7

 

一、把兰伯特模型改成半兰泊特模型

昨天的兰伯特是cos(x):

 

数学公式:

 

优化数学公式:不让它为负数;:

 

 

 

 

dot就是cos函数

 

给它加一个颜色:

效果:

 

 二、

高光反射:

 

cos x 中的x是反射光与视野方向 的夹角;

max:如果 cosx是负数 就去0,

pow:代表前边的高光参数的次方 是几就是几次方

 

图形:

 

 

步骤:

 

先在顶点函数里面实现:

1.获取反射光的方向:找入射光的方向和法线的方向

 用是shader3里的拿来做shader6::没有加代码的时候

 

通过reflect(入射光取负方向,法线)

得到反射光方向:

获取视野的方向。得先获得相机的方向:相机位置点减去反射点的位置
——————》相机位置
把所有的点找到,这是自身的点,转换才成世界坐标的点-》

向量化后接受:这儿就是套用公式:

 

————————————————————————————————————————

放片元函数里看效果 从第4个脚本复制来修改:

 1.法线和入射光的方向

世界坐标的法线,世界坐标的所有顶点坐标:

 

 

 

所有焦点坐标转换为世界坐标

 

计算视野方向与反射光的方向:

 

 

 

posted @ 2018-11-20 10:56  白纸菇凉  阅读(322)  评论(0编辑  收藏  举报