Unity3dShader – 兰伯特和半兰伯特漫反射

  • A+
所属分类:UnityShader 原创文章

 

一、来解析一下这一堆代码吧!首先,看前面一段,属性的声明,_Diffuse-属性("显示的名称",Color(类型)) = (1,1,1,1)


二、两个结构体

a2v表示 application to vertex,表示是应用传进来给顶点函数的,v2f表示vertex to fragment,表示的是顶点函数传递给片元函数,里面属性加:后面的是语义,POSITION表示顶点,NORMAL表示法线,都是模型空间的,SV_POSITION表示传入给片元函数的顶点数据,COLOR0就是颜色的意思

 


三、声明顶点处理函数和片元处理函数

 


四、顶点函数

传入a2v结构数据,在里面构造出v2f数据,UnityObjectToClipPos(模型顶点)  转化模型空间的点到剪裁空间,unity_ObjectToWorld 模型空间到世界空间的转换矩阵,_WorldSpaceLightPos0  世界空间下的光线方向,半兰伯特计算公式,dot() 点乘范围=cos()[-1,1],*0.5后[-0.5,0.5],再+0.5=[0,1],刚好是0-1之间,受光照的强度,颜色相乘表示融合,颜色相加表示加强

 


五、片元函数

SV_Target语义表示 返回的颜色

 


六、兰伯特的计算公式

缺点就是,小于0的,就是[-1-0]区间的都是0,这样就会黑乎乎一片

兰伯特和半兰伯特效果对比

Unity3dShader - 兰伯特和半兰伯特漫反射

左边是兰伯特(黑乎乎的),右边半兰伯特

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: