博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shader 讲解的第二天 把兰伯特模型改成半兰泊特模型 函数图形绘制工具
阅读量:7031 次
发布时间:2019-06-28

本文共 7693 字,大约阅读时间需要 25 分钟。

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 }
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.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 }
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.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 }
shader7

 

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

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

 

数学公式:

 

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

 

 

 

 

dot就是cos函数

 

给它加一个颜色:

效果:

 

 二、

高光反射:

 

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

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

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

 

图形:

 

 

步骤:

 

先在顶点函数里面实现:

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

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

 

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

得到反射光方向:

获取视野的方向。得先获得相机的方向:相机位置点减去反射点的位置

——————》相机位置
把所有的点找到,这是自身的点,转换才成世界坐标的点-》

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

 

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

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

 1.法线和入射光的方向

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

 

 

 

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

 

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

 

 

 

转载于:https://www.cnblogs.com/satanj/p/9987635.html

你可能感兴趣的文章
GCC Stack-Smashing Protector
查看>>
虚拟机Visualbox安装Ubuntu Server
查看>>
用带余除法可以解决一切部分分式的题目
查看>>
vs 生成事件
查看>>
jmeter 实战项目总结2——微信端
查看>>
php.ini 中文版
查看>>
即时通信客户端流程,
查看>>
布隆过滤器redis缓存
查看>>
01-数据仓库之数据建模
查看>>
Nginx 安装
查看>>
hidesBottomBarWhenPushed 设置为NO的问题
查看>>
cisco常用命令详解
查看>>
谁在追踪谁?
查看>>
HTTP请求返回状态码详解
查看>>
句柄类
查看>>
GitLab
查看>>
【常用配置】Spring框架web.xml通用配置
查看>>
[leetcode 240]Search a 2D Matrix II
查看>>
域名指的是这一级目录
查看>>
[Angular] Creating an Observable Store with Rx
查看>>