Unity_Shader学习笔记_01_关于漫反射和高光反射等基本的计算.shader入门精要

本文介绍了Unity中Shader的基本概念,重点讲解了漫反射(Diffuse)和高光反射(Specular)的计算过程。漫反射通过兰伯特模型或半兰伯特模型计算,高光反射则采用Phone或Blinn-Phong模型。内容包括光照颜色、法线、反射方向和视角方向的处理。
摘要由CSDN通过智能技术生成

输出颜色由几个部分组成,一个是漫反射(Diffuse),一个是高光反射(Specular),还有环境光遮蔽(Ambient)等。

漫反射(Diffuse)由基本颜色和灯光颜色,灯光模型计算得出。

fixed3 diffuse = _LightColor0.rgbalbedomax(0, dot(worldNormal, worldLightDir));
_LightColor0.rgb:灯光颜色
albedo:基本颜色
max(0, dot(worldNormal, worldLightDir)):光照计算,此时使用的是兰伯特漫反射模型,即法线点乘以灯光方向,如果采用半兰伯特模型,则要将max(0, dot(worldNormal, worldLightDir))映射到(0.5,1)的范围,现在范围为0到1,所有半兰伯特模型的计算为 fixed halfLambert = dot(worldNormal,worldLightDir)0.5 + 0.5;
则漫反射就变成了:
fixed3 diffuse = _LightColor0.rgb
albedo*(dot(worldNormal,worldLightDir)*0.5 + 0.5);

高光反射(Specular):可以简单的理解为是模型上的高光,亮条(斑)的颜色。计算方法是由高光颜色,灯光颜色,高光反射模型得出。

fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir)), _Gloss);

_LightColor0.rgb和上面一样,这个是灯光颜色
_Specular.rgb:高光颜色。
pow(saturate(dot(reflectDir, viewDir)), _Gloss),这是高光反射模型,也就是Phone模型,他是由反射光和视角方向的点积的_Gloss的指数表示。_Gloss表示反射指数,我是理解为扩散范围,即是亮斑的大小。

采用Phone模型,则需要反射光和视角方向,反射光可以由unity自带的reflect(灯光入射方向(也就是灯光方向的反方向),法线),直接得出反射光,此处注意要得出世界空间下的反射光,必须要将灯光方向,法线都通过坐标变换到世界空间里来得出(必须要再同一坐标系下才存在意义)。

fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//法线的坐标转换是乘以顶点坐标转换的逆矩阵
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);

reflect函数具体计算,是2法线点乘入射光方向法线的长度-入射光

采用BlinnPhone模型,基本都和Phone差不多
Phone模型:fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir)), _Gloss);

BlinnPhone模型:
fixed3 halfDir = normalize(worldLightDir + viewDir);
fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(worldNormal, halfDir)), _Gloss);

把视角方向变成了视角方向与灯光方向的归一化矢量和,其他都一样,优点也是存在比Phone模型得到更大的亮斑(我自己测试没看出来,只有把灯光拉到诡异的角度才看出来)。

优点的话,是BlinnPhone拥有更小的计算量,因为是用法线点乘halfDir,不需要单独去计算反射光反向(不需要反射光方向),并且存在更好(不逊色)的效果。

此外,Phone和Blinn_Phone模型都是经验模型,不是正确的物理计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值