PBR地形纹理研究——多重纹理不同质量等级的切换

demo视频

之前研究了一下PBR(Physically Based Rendering)用于角色时的一些效果,然后我再研究了一下用于地形上面多层纹理时的情况。
我之前写了一个多层纹理的shader,作用是支持4张漫反射通道的贴图作为纹理,通过一张遮罩图片来控制叠加关系,这样的地形效果如下:
PBR地形纹理研究——多重纹理不同质量等级的切换

稍微做了一些修改,加入了法线贴图和高光贴图的支持,效果会变成这样:
PBR地形纹理研究——多重纹理不同质量等级的切换
对比起单纯的漫反射贴图,这个效果已经有了明显的凹凸和部分的高光。

接下来我重新写了一个shader,这个shader是支持4层纹理的地形,然后支持PBR渲染,可以指定金属贴图和高光贴图,效果如下:
PBR地形纹理研究——多重纹理不同质量等级的切换
对比起传统的高光法线贴图效果,PBR会感觉地面的质感更强,如果高光贴图控制了某些部分的强高光,会出现像左下角石头上面的水迹的效果。

然后对于水的效果,这一个是EasyWater里面的Water4效果:
PBR地形纹理研究——多重纹理不同质量等级的切换

我做了一些修改,让他变成了PBR材质,效果如下:
PBR地形纹理研究——多重纹理不同质量等级的切换

既然我已经做出了多种级别的效果显示,用意应该是很明显了。我就是想在手机游戏上面设置不同的显示质量。在最低质量时,将会只是显示单纯的漫反射通道效果,中级质量时,会显示高光法线效果。最高质量时将会显示PBR材质效果。
效果切换也是挺方便的,因为所有的shader都是自己写的,所以可以很容易的控制他们的结构统一性,在切换质量显示时直接切换shader就行了。具体效果可以参考最上面的视频。
这里存在一个问题,假设你是用Shader Model 2.0来写shader,如果是用Unity自带的那个PBR光照模型作为shader的基础光照模型使用,将会消耗比较多的运算符,而导致在写一些稍微复杂一点的叠加效果时会报错运算符超过最大限制。因为Shader Model 2.0在编译成汇编着色器时最多只支持64个运算符。这个问题是基本无解的,只能把shader改成Shader Model 3.0。
如果害怕某些机器不支持Shader Model 3.0。那么在切换shader显示之前可以先判断一下机器的硬件情况,获取SystemInfo.graphicsShaderLevel,如果大于等于30,那么设备就是支持Shader Model 3.0的了。