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.1410 _Range("Range",Range(1,10))=611 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{}13 }14 SubShader//可以有很多个 显卡运行时 从第一个开始运行15 {16 Pass //Pass块相当于一个方法 至少有一个Pass17 {18 CGPROGRAM19 //在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 a2v31 {32 float4 vectex:POSITION;33 float3 normal:NORMAL;34 };35 struct v2f36 {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 ENDCG61 }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.1410 _Range("Range",Range(10,50))=1011 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{}13 }14 SubShader//可以有很多个 显卡运行时 从第一个开始运行15 {16 Pass //Pass块相当于一个方法 至少有一个Pass17 {18 CGPROGRAM19 //在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 a2v31 {32 float4 vectex:POSITION;33 float3 normal:NORMAL;34 };35 struct v2f36 {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 ENDCG63 }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.1410 _Range("Range",Range(10,50))=1011 _2D("Texture",2D)="white"{}//2D图片变量 12 _3D("Texture",3D)="black"{}13 }14 SubShader//可以有很多个 显卡运行时 从第一个开始运行15 {16 Pass //Pass块相当于一个方法 至少有一个Pass17 {18 CGPROGRAM19 //在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 a2v31 {32 float4 vectex:POSITION;33 float3 normal:NORMAL;34 };35 struct v2f36 {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 ENDCG67 }68 }69 70 }
一、把兰伯特模型改成半兰泊特模型
昨天的兰伯特是cos(x):
数学公式:
优化数学公式:不让它为负数;:
dot就是cos函数
给它加一个颜色:
效果:
二、
高光反射:
cos x 中的x是反射光与视野方向 的夹角;
max:如果 cosx是负数 就去0,
pow:代表前边的高光参数的次方 是几就是几次方
图形:
步骤:
先在顶点函数里面实现:
1.获取反射光的方向:找入射光的方向和法线的方向
用是shader3里的拿来做shader6::没有加代码的时候
通过reflect(入射光取负方向,法线)
得到反射光方向:
获取视野的方向。得先获得相机的方向:相机位置点减去反射点的位置
——————》相机位置把所有的点找到,这是自身的点,转换才成世界坐标的点-》向量化后接受:这儿就是套用公式:
————————————————————————————————————————
放片元函数里看效果 从第4个脚本复制来修改:
1.法线和入射光的方向
世界坐标的法线,世界坐标的所有顶点坐标:
所有焦点坐标转换为世界坐标
计算视野方向与反射光的方向: