使用Blinn-Phong光照模型
Specular=直射光颜色*pow(max(cosθ,0),10) θ:是发现和x的夹角 x是平行光和视野方向的平分线
1 | Shader "AladdinShader/09 Specular Fragment Blinn Phong Shader" |
会发现高光部分会显得更大了,这也是平时用的比较多的高光反射模型。
使用Unity的内置函数
UnityCG.cginc中一些常用的函数
//摄像机方向(视野方向)
- float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标得到(世界空间)从这个点到摄像机的观察方向
- float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标=>世界空间从这个点到摄像机的观察方向
- float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标=>模型空间从这个点到摄像机的观察方向
//光源方向
- float3 WorldSpaceLightDir(float4 v) 模型空间中的顶点坐标=>世界空间中从这个点到光源的方向
- float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标=>世界空间中从这个点到光源的方向
- float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标=>模型空间中从这个点到光源的方向
//方向转换
- float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间=>世界空间
- float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=>世界空间
- float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=>模型空间
上面BP模型修改:
1 | Shader "AladdinShader/09 Specular Fragment Blinn Phong Shader" |
运行效果还是跟上面效果一样,BP模型是常用的模型,会发现背光面并没有一些奇怪的光斑,更符合生活常理。
漫反射和高光反射统一实现
1 | // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' |
以上这一段一定要熟练敲熟并且弄懂。效果图也跟上面效果是差不多的。