Unity山寨PBR

这个和我之前在贵易实习的内容相关,当时是参考了SIGGRAPH 2013 Course里的材料,主要是UE4和COD9两节;以及KlayGE博客上的系列介绍游戏中基于物理的环境光渲染

话说虽然Unity 5已经提供了PBR,而且还有Skyshop这种插件(见unity3d 基于物理渲染的问题解决);出于练手,我还是参考UE4在Unity 4.6里山寨了一发。做的时候需要打开线性空间、HDR和Tone Mapping,才能看得出效果~另外UE4里的ambient cubemap是用的hdr格式,而我在Unity里是转换到dds cubemap了,所以表现力下降了不少。

粗糙度不变,金属度增大:

金属度不变,粗糙度增大:

山寨UE4效果:

Vehicle:

只能说看得出这个意思吧…不过效率还是有点费。于是我尝试了使用烘焙,结果发现两个问题:

  • Custom Lighting Models in Surface Shader里描述的half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);会导致编译错误,即使用LIGHTMAP_OFF等宏来切换,生成出来的surface shader代码也编译不过(不会自动将viewDir传进来);
  • 尝试了下Directioanal Lightmap, 直接输出scale结果很奇怪,不知道怎么回事,反正最后导致金属度高的材质的环境贴图贡献明显看到一条缝…

总之如何利用烘焙来搞定PBR我还存疑…把Lightmap作为IBL主要精度是很大问题,而且跪求Unity支持HDR Cubemap啊啊啊~

ps. 环境贴图是找的Light Probe Image Gallery里的资源;转换过程见HDRShop和CubeManGen生成环境贴图

ps2. 有人私信问我要预计算LUT的代码,也一起提供了