UE4·体积材质

打算用houdini在UE4里做一些奇形怪状的体积云和气雾效果,故此有了本文。

体积云的常见做法,一种是2D贴片云,一种是3D体积云。

贴片云之前在Unity Procedural Skybox中有类似的实现,使用了一张noise贴图,通过cutoff凸显出云的形状,加以扰动和多层颜色可以呈现出不错的风格化云效果。

最近看到知乎上这位老哥在做写实风的公告牌云,使用houdini制作形状和法线的贴图,flipbook制作云的扰动动画,效果更加写实精细。简言之贴片云是制作云的一种廉价方案,个人感觉用作高空区域的云可能跟体积云也没啥区别。

而3D体积云则有切实的“体积”,体积感更强,可以用在一些近距离的场景,也可以实现与物体交互的效果。

关于体积材质的制作,主要看了这篇帖子,介绍了SD制作体积贴图的方法,里面提到的shaderbit网站中的相关博文帮助很大,对体积材质渲染的原理也有详细描述。本文也会提到houdini制作体积贴图的做法。

关于体积云

之前看RTR有写过一篇笔记,最近又补上了部分内容,关于这部分的理论解释差不多完整了(在梦里,还有一半没看…)。

使用SD制作3D贴图

3D贴图将一张贴图分割为a × a等份,自左到右自上到下一次读取单份贴图,全部读完堆砌起来,就构成了3D贴图。

在SD中通过构造3D position图来获取3D贴图中各个切片在一张正方形贴图中的位置。然后通过SD的3D系列节点在各个位置上生成所需形状。

下图为一个球形3D贴图的生成过程:

通过RGBA Merge在各个通道上组合出3D贴图的position图,其中RG通道构成单张贴图的uv信息,B通道确定各个切片在一张贴图中的位置信息。

之后将position图输入3D volume mask,可以获得球形的3D体积贴图。(注意如果长宽为偶数,就会出现下图这样,有一行空出来的情况…)

注意3Dtexture的alpha通道会影响渲染效果,如果想要获得准确的3D形状,alpha通道需要设置与mask相同,可以用Alpha merge组合mask到透明通道。

使用Houdini制作3D贴图

Houdini的Labs工具提供了Volume Texture节点,用于从体积生成3D贴图。需要进节点里修改一下透明通道,不然导出图片会有灰色背景色。

UE4体积材质

在UE4中创建体积贴图(volume texture),将上面制作的3D贴图应用上。左上view可以切换贴图模式或3D体积预览模式,如果体积显示为全黑,大概是alpha通道没关。

体积贴图创建完毕后,将贴图直接拖到模型上,UE4会自动帮忙创建体积材质,但是那个材质我没跑通,我用的材质长下面这样:

应用材质到模型后,记得在场景中放入exponential height fog并打开其下的Volumetric fog选项!否则几乎啥也看不见,不明显的话打一盏spot light会更清楚。

最终效果如下。

参考

  1. The basics of creating pseudo volume textures in Substance Designer - Tutorial

  2. eNTAGMA·QUICK VDB CLOUDS