今天终于抽空来更新了。
前几天尝试加入反射探头的效果,最后发现其实我就加进去了,或者说是unity早就封装好了更准确一点。具体的情况如下:
在unity的反射处理方面,即使是最新的standard天空盒反射和反射探头其实也被算作cubemap,只不过unity内部在底层包好了,分别是unity_SpecCube0和unity_SpecCube1,前面的是场景的天空反射盒,后面的是反射探头,当你调用unity_SpecCube1的时候unity会自动根据你传入的信息找到最近的反射探头,并把算好的数据返给你,具体地说对于天空盒反射用这句话
fixed3 o.reflcol = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, i.worldrefl, roughness)这里i.worldrefl就是之前算出来的反射向量o.worldrefl = reflect(-WorldSpaceViewDir(v.vertex), UnityObjectToWorldNormal(v.vertex));roughness虽然我也这么写但是和之前提到的 1 - smooth不太一样,实际上这个值在我代码里叫finalroughnessfixed finalroughness = _Smoothness; finalroughness = 1.7 - 0.7 * finalroughness; finalroughness *= (1 - _Smoothness) * 2;这个公式基本是unity用于shadermodellevel<30的设备,也就是低端机 ,这个乘以二并不是官方的写法,官方取了一个内置值,我这边简单取个二效果相差无几。拿到reflcol之后只需要乘到brdf算出来的颜色上就行了,然后如果你发现颜色变暗,把反射颜色乘以4左右基本可以等同unity standard的天空盒反射效果。
然后 好消息是就这样除了天空盒反射之外,反射探头也生效了,搞不懂unity都干了些什么,明明unity_SpecCube1才是管探头的。
下面是图(咱就不说jb了):
这个胶囊体如假包换地用的我的shader,原理也跟上面一样,没有偷偷加东西哦。
然后进一步研究后,再结合实际,我给我们美术提出做镜面模糊反射效果(受到反射探头尺寸和抗锯齿问题,如果反射太清晰就会锯齿严重),配合一个网上找到的脚本,就能实现地面反射效果,到时候再贴点法线贴图,放点粒子效果,模拟个很有感觉的场景不是问题,在合理设置反射探头贴图尺寸外加精简shader后,配合前面介绍的分辨率缩减+锐化,基本有把握让美术在类似5人副本之类的小地图上跑个20-30帧(低端机哦,比如我的华为6)。地面反射就不上图了。
今天就先到这里吧。如果想和我交流一下的话我留个QQ好了 1729915959
新闻热点
疑难解答