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了,所以表现力下降了不少。

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

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

山寨UE4效果: PBR_metal

Vehicle: PBR_vehicle

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

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

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

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

ps2. 项目工程下载 记得打开HDR和线性空间颜色。场景里放了三个球,左边和中间的差不多,不过一个是可以从贴图读取粗糙度和金属度、另一个只能用滑杆整体调整;右边是我山寨UE4的。烘焙那块一直没搞定~等有空再分析下unity 5的3种PBR实现吧。

ps3. 有人私信问我要预计算LUT的代码,也一起提供了C++版本

PBR_lut