Unity3dShader-高光反射模型

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

在漫反射条件下再加多了一个高光,Blinn计算公式是 :直射光 * pow(max(cosβ,0),范围系数),β角指的是反射光的方向和该点到相机(视野)方向的夹角

 


因为这里写的是逐像素计算的,所有在顶点函数中只计算了一些片元函数需要的数据,通过结构体v2f传递过去。主要是两个数据,一个是世界坐标下的模型顶点坐标,用来计算视野方向和光线方向。另一个是世界坐标下的法线向量

 


主要处理的片元函数,因为计算高光反射的影响系数,需要一个反射光方向和视野方向,这里通过reflect()方法,传递一个入射光线的方向和法线向量计算出反射光方向,下面通过UnityWorldSpaceViewDir(世界坐标下的顶点坐标) 得到视野方向。最后,通过计算公式算出系数,在乘光的颜色那就行了

 


这里还是讲一下内置的一些方法

UnityWorldSpaceViewDir/UnityWorldSpaceLightDir  ,使用Unity开头-》传递一个世界坐标,转化为世界空间视野/光照方向

WorldSpaceViewDir/WorldSpaceLightDir,没有Unity但还是有World-》传递一个模型空间坐标,转化为世界空间视野/光照方向

ObjSpaceViewDir/ObjSpaceLightDir,模型到模型视野/光照方向

 

最后要注意的是,表达方向的时候要使用3维的向量表示。今天用4维的来表示法线了,结果高光出现问题了。反正方向是不需要平移的w分量的

 


这是另外一个高光模型,主要就是计算系数的公式不一样,Blinn-Phone计算公式 : Specular = 直射光 * pow(max(cosβ,0),范围系数),β角指的是法线和x的夹角,x指的是直射光和视野方向的平分线

 


最后看看两者的效果

Unity3dShader-高光反射模型

左边是Blinn模型,右边是Blinn-Phone模型

发表评论

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