实现环境贴图的技术途径主要有三种:立方体贴图、IBL和球面谐波照明。
我之前已经讲过立方体贴图和IBL,今天我将重点讨论球面调和照明。
在立方体贴图IBL的基本设置中,除了镜面反射(光泽反射)之外,卷积类型属性还可以设置为漫反射(红外)。
IBL使用镜面反射来模拟间接光镜面反射,而漫反射则用于模拟间接光漫反射。
间接照明漫反射(以下简称漫反射)有两种实现方式:一种是IBL,另一种是球面谐波照明。让我们看看IBL是如何实现漫反射的。
IBL漫反射漫反射不同于镜面反射,它的颜色变化不会随着视角的旋转而改变。要用IBL实现漫反射,我们必须首先设置漫反射(反射率)属性。
镜面反射的颜色会随着视角的变化而变化,漫反射则不会。计算颜色时,只与法线方向有关。因此,IBL漫反射的计算公式为
//漫反射颜色的计算float4 uv_ibl=float4(normal_dir,MIP _ level);half 4 color _ cube map=texCUBElod(_ cube map,uv _ ibl);half 3 env _ color=解码HDR(color _ cube map,_ cube map _ HDR);大家可以对比一下离子束刻蚀法高光反射计算的方式,
半4色立方体贴图=UNITY _ SAMPLE _ tex cube _ LOD(UNITY _ spec cube 0,reflect_dir,MIP _ Level);half 3 env _ color=解码HDR(颜色立方体贴图,unity _ spec立方体0 _ HDR);在贴图尺寸设置上,
漫反射效果,忽略AO,物体周围的光线强度基本一致,强弱差别不大,视觉上也呈现出温和的效果。
球面调和照明球面调和照明的主要应用是计算间接照明(也叫环境光),其中间接照明是指天空盒发出的光。
IBL还计算间接照明。skybox发出的环境光有什么特点?它最大的特点就是skybox是无限的,所以我们可以忽略位置信息,只考虑法线信息。也就是说,不管我们的模型有多大,
当计算模型上的特定点时,我们认为它在天球的中心。
然而,IBL在计算间接光照时最大的缺点是纹理采样。使用IBL的方法,我们需要存储一个立方体地图。纹理采样的带宽对于电脑来说可能不算什么,但是对于手机来说就有点奢侈了。
球面谐波照明可以说是一种性能更加优化的计算方法,弥补了IBL的不足。
这里不讨论如何实现球面谐波照明,因为涉及的数学模型计算过于复杂。我们只关注如何统一实现球面谐波照明。
我们首先要了解球谐照明最基本的原理,就是从立方体贴图中提取7个球谐照明系数,然后通过一些复杂的数学计算生成照明颜色,最后赋予物体。
这些系数的格式如下所示,仅供参考:
获取到这些系数后,然后把它传递到shader里面参与计算,计算的核心代码如下所示:
float4 normalForSH=float4(normal_dir, 1.0);//SHEvalLinearL0L1half3 x;x.r=dot(custom_SHAr, normalForSH);x.g=dot(custom_SHAg, normalForSH);x.b=dot(custom_SHAb, normalForSH);//SHEvalLinearL2half3 x1, x2;//4 of the quadratic (L2) polynomialshalf4 vB=normalForSH.xyzz * normalForSH.yzzx;x1.r=dot(custom_SHBr, vB);x1.g=dot(custom_SHBg, vB);x1.b=dot(custom_SHBb, vB);//Final (5th) quadratic (L2) polynomialhalf vC=normalForSH.x*normalForSH.x - normalForSH.y*normalForSH.y;x2=custom_SHC.rgb * vC;float3 sh=max(float3(0.0, 0.0, 0.0), (x + x1 + x2));sh=pow(sh, 1.0/2.2);half3 env_color=sh;光照探针掌握了球谐光照的基本原理,
球谐光照是光照探针的使用基础,如果手动实现球谐光照,就要像上面一样又是计算光照系数,又是引入立方体贴图,还要在shader中进行大量复杂的计算。这无疑非常困难。
但unity已经给开发者封装好了这一系列操作,它就是光照探针!我们来看看光照探针是如何使用的。
全局光照探针如果场景中没有放置光照探针,unity会默认使用一个全局光照探针,它是在Lightint面板中设置的。
不过,在此之前要先烘焙立方体贴图,这和使用反射探针的操作是一样的。
Environment Light是设置光照探针烘焙贴图的相关属性
Environment Reflections是设置反射探针烘焙贴图的相关属性
设置完成后,点击Generate Lighting按钮,就会在场景Scene文件夹下生成一张带有光照信息的立方体贴图。
第二歩、漫反射的计算。球谐光照的shader计算很复杂,但是使用unity内置的球谐光照计算方法ShadeSH9(),计算就会变得非常简单,不过在此之前,还需要设置LightMode、引入相关文件,
具体如下:
Tags{'LightMode'='ForwardBase'}CGPROGRAM#pragma multi_compile_fwdbase#include 'AutoLight.cginc'#include 'UnityCG.cginc'half3 env_color=ShadeSH9(float4(normal_dir,1.0));打开Frame Debugger,在渲染流程中可以查看到球谐光照的系数信息
手动计算球谐光照,需要开发者自己在参数面板上设置球谐系数值,这些系数值的计算是一个非常复杂的过程,往往需要借助一些第三方工具。而使用全局光照探针和unity内置的球谐光照计算的函数,
就免去了上述一系列复杂的操作。
对比一下手动计算球谐光照和使用光照探针计算球谐光照的效果,二者之间没有太大的差别。
局部光照探针局部光照探针需要开发者手动添加,我们来看看该如何操作?
1、添加LightProbeGroup
2、进入edit 模式,排列布置探针小球的采样点位置
3、添加光源,光源模式设置为Baked
4、在Lighting面板中勾选“Baked Global Illumination”,然后点击“Generate Lighting”
5、最后看看效果,当物体移动时,物体表面的光照也会时刻发生变化。
为什么会这样呢?这是因为烘焙贴图后,光照探针组的每一个光照小球,都带有球谐值。我们可以通过下面的设置,直接查看光照小球的信息。
点击物体模型,带线条的小球就是对物体光照产生影响的光照探针。当物体移动时,它附近的光照小球可以将携带的球谐信息进行插值混合运算,生成新的球谐系数,最后再赋予给物体的shader,从而照亮物体。
标题:球球大作战毅呦(球球大作战杀马特)
链接:https://www.52hkw.com/news/rj/65461.html
版权:文章转载自网络,如有侵权,请联系删除!