Ambient Cubemap 环境立方体贴图
- 用处
在标准光照模型(Blinn-Phong模型)中,进入摄像机的光线分为4种,自发光、高光反射、漫反射、环境光。其中环境光适用于描述物体所收到的间接光照的。而Ambient Cubemap用于高质量光照环境的立方体贴图。 - 实现方式
其实就是对物体的六个方向拍照,得到一个cubemap,然后根据不同的光泽度,生成不同模糊程度的图片保存在不同mipmap中,然后根据物体的粗糙度、法线等因素,在shader中针对cubemap编写算法,然后将计算出来的结果,参与最终颜色的生成上。 - 注意事项
由于环境光并非一般的方向光,可以认为它的光照来自四面八方。所以不能对其使用shadow map,而只能使用SSAO,建议与带阴影的动态光照产生的直接光照组合使用。 - UE4中的使用方法
很多地方可以使用Ambient Cubemap,这里只说一种使用方式:在后处理中对全场景使用ambient cubemap:- 首先在关卡中拖进一个Post Process Volume,并对其Unbound属性的checkbox进行勾选,目的是是的这个后处理将影响整个世界
- 如果不将Post Process Volume与整个世界关联,也可以不勾选其Unbound选项,而是调整其blend Radius即可
- 在Post Process Volume的Settings的Ambient Cubemap属性中,赋给其一个Cubemap Texture(),设置其Intensity,用于影响其光的强度,设置Tint用于影响颜色。
- 这里赋予的Cubemap就是我们刚才一直说的ambient cubemap,这里用的是预先准备好的cubemap,其实也可以在游戏中生成cubemap,但是会比较耗费性能
- Intensity和Tint这俩属性与原生的Ambient Cubemap算法无关,只是UE4给这个算法添加的两个属性,用于,比如我们准备了一个场景白天时候的Ambient Cubemap,然后可以通过修改这个Intensity和Tint,然后不修改Cubemap,就可以获取到这个场景晚上的Cubemap了。
- 设置世界中物体的材质,将其金属度设置为1,这个值是用于blend直接光和cubemap的,值越高,cubemap的比重越大;将其粗糙度设置为0,这样将使用清晰的Cubemap mipmap。
- 在这里还可以设置法线,但是一般使用默认法线就好,如果设置其他法线可能会造成扭曲的效果
- 这里还能获取到上一步设置的Ambient Cubemap Intensity和Tint,用于设计更复杂的算法
- 首先在关卡中拖进一个Post Process Volume,并对其Unbound属性的checkbox进行勾选,目的是是的这个后处理将影响整个世界
- UE4源码中相关的类
FCubemapShaderParameters:- 成员变量
- AmbientCubemapColor,由于AmbiendCubemap的实际使用方法还是将Cubemap中的RGBA值采样出来,参与到最终颜色的计算,所以通过设置这个参数,可以设置使用Cubemap的哪几个通道,各个通道采样的比例、颜色偏移等
- AmbiendCubemapMipAdjust,由于需要根据绘制物体的粗糙度等因素,计算出来使用cubemap的哪层mipmap,而设置这个参数,可以对此进行修正
- AmbientCubemap和AmbientCubemapSampler用于指定Ambient Cubemap指的Cubemap texture。
- 成员函数
- 函数Bind,用于将4个成员变量与shader中对应的变量进行bind
- 函数SetParameters/SetParametersTemplate通过给4个成员变量赋值进而给shader中的对应变量赋值
- 使用位置
- PostProcessAmbient类,正如刚才举到的例子,后处理中可以使用Ambient Cubemap,所以在这个后处理类中使用到了该类。
- FInjectAmbientCubemapPS类。
- 成员变量