最近学习了SubstanceDesigner的官方教程,这个是用默认OpenGL渲染的最终效果。

跟着教程做了一遍之后,东西虽然做出来了,但是涉及的东西很多,学完之后感觉自己好像也没记住什么。所以在这里把制作流程和思路梳理下来,当然也包含了一些自己的理解和延展,但是一些基本的知识就不会写了。

官方的这个教程在B站上有很好的中文翻译版本,点击这里查看

这里建议最好全部看完才来看笔记,至少也要看完前面几节,对整体理解SD和一些基础操作很有帮助。下面就开始吧!

在SD中创建材质的流程,就是先专注制作高度贴图,将高度贴图制作好,再通过Height信息提取想要信息去制作其他节点,比如颜色、粗糙度等等。

首先我们要在空的Graph中创建一个Bese Material,然后右键将Base Material拖拽进3D View视窗中,就可以直接渲染当前的材质效果了。

首先有个疑问就是,这里为什么不直接创建Output节点,而是要使用Base Material节点呢?这样做也是个人习惯和方便,这个Base Material本身包含了全部的PBR节点输出,比如现在,我们只需要专注调节高度贴图,但是如果想要正常显示材质,颜色、粗糙度等等通道也需要有,如果一个个去创建节点,对于现在来说是没必要的,而且Graph中节点越多就越容易乱,我们现在完全可以使用一个材质预设,将现在不需要调整的输出通道用预设来生成,需要调节的通道再手动调节就是了。

所以先调节Base Material节点,在Instance Parameter中的User-Defined Maps,将Normal、Ambient Occlusion和Height改为True,这样Base Material就多了三个输入节点,依次是刚才那三个通道。剩下的节点,我这里只是提高了粗糙度,一是本身制作的材质就没有那么高的反射,再就是反射太高的话,看不太清比较小的高度变化。还有一个需要调节的是Height参数中,需要把Height Range调节为1.默认0.5的情况下,当你在左边制作好高度贴图,Base Material在输出出去的时候会把对比度变低,这里改为1的话,就是输入什么样,输出也什么样了。

为什么是这三个节点呢?Height就不必说了,我们要调整的就是高度通道,必然需要一个Height,Normal则是为了更好的体现表面的Height变化。以前我一直以为,在使用贴图时,高度和法线贴图只需要用一个就可以了。其实不是这样的,至少在SD中,没有法线通道,材质的细节会丢失很多。所以在以后使用其他渲染器的时候,如果可以的话,也会将高度和法线贴图都连接上。

再一个比较费解的为什么要添加AO通道,AO通道在游戏中是关键的通道,但是像我们使用OC或者RS,甚至都没有一个专门一个通道是留给AO的,也就是说,在使用OC或者RS时候,AO其实是不需要参与材质表现的。虽然说把AO通道叠加到颜色通道中可以得到更多的细节,那为什么不直接在制作颜色通道时候就把细节添加进去呢?而且OC和RS都可以自己生成AO贴图出来,也就是说,这两个渲染器都可以自己计算AO,这更不可能是需要外部AO贴图了。

但是调过测试我才明白,AO应该是提供给那些实时渲染器使用的,比如说SD中默认的OpenGL渲染,如果没有AO数据的话,整个材质外观都是黑色的,只有给正确的AO信息,才能正常的显示出来。而如果你使用离线的IRay渲染,则不需要AO,也可以正常渲染。所以说,我们在制作的时候可以添加AO节点,为了能使用OpenGL快速渲染。至于输出的时候需不需要导出来,则完全看个人意愿了。当然这里还是建议输出出来,多一张贴图就多了一些信息,万一以后没准需要用到呢。

接着添加一个Perlin Noise节点,至于为什么选择Perlin Noise,包括后面很多的节点选择,其实都是个人经验,做的越多,就能明白什么节点放这里合适了。

这个Perlin Noise的作用,就是给整个材质一个大框,有一个粗略的高低起伏变化,模拟泥土地面最基本的高低变化。所以这个噪波不需要太小,我将Scale值降低到了4.整个材质看上去大概的高度变化就可以了。

然后通过Normal Sobel节点和Ambient Occlusion节点,将高度贴图分别转为法线贴图和AO贴图。其实直接搜Normal的话,有很多关于Normal的贴图,这个Normal Sobel的作用则是更好的将高度贴图转为法线贴图,

可能都有点看不出来,所以我们还需要对刚才加入的Normal Sobel和AO节点进行一些调整。

首先是Normal Sobel中,在Instance Parameters的将Intensity调节为24.这个数值的来源,就是看法线贴图是不是能完全将这个高度变化表现出来,默认是1的时候,显示法线的2D View根本就是纯色的,这也意味着虽然我们给了高度变化,但是实际上法线却根本没有表现出来。当调整到20以上的时候,法线贴图的2D View才能很好的体现出来。

然后需要调节的是AO节点,现在的变化在3D View中看不太出来,还有个原因就是我们现在用的是OpenGL渲染,它需要AO来提供信息才能正确渲染,所以这里提高AO节点中的Height Depth,提高到了0.3左右,这个数值需要看3D View中的效果是否满意,至少要能看出前面的Perlin Noise的黑白变化。其实很多的时候参数的调节都是基于审美和经验。至于AO节点中的GPU加速,我这里也勾选上了,没勾选之前,计算这个AO节点需要160ms,勾选上之后就只需要40ms了,提高的效率非常明显。

之后,我们还需要额外的调整一下渲染设置,首先是改一下渲染的高度算法,在3D View的菜单栏中,找到Material->Default->Definitions->physically_metallic_roughness[default]->Tessellation.

至于Parallax Occlusion和Tessellation的区别,就不在这里展开了,在RS中是使用Tessellation渲染方式的,OC虽然不太清楚,但是离线渲染器中应该都是使用这个模式。

最后在3D View菜单栏中,找到Materials->Default->Edit。将Height属性中的Scale改为10.

要注意这里调整的Scale,是对渲染器做出的调整,不是对贴图进行的调整。什么意思呢?这个scale操作,相当于我们把高度贴图连接进了RS的Bump通道,然后通过调节RS的bump map的height scale。但是很奇怪这个调整对IRay渲染就不起作用。所以很多时候用OpenGL看起来高度刚好满意,但是到IRay又变的特别平了。

这里,我们就可以看到平面的起伏很明显了。

但是有一个核心问题要记住,我们现在不停的调整这个高低,不是为了达到什么参数才可以,一切的目的都是为了看上去是我们想要的效果,假如说我做一个地毯材质,那就不可能给这么一个高度变化了。

而后面通过调整渲染的Height Scale而不是直接调整高度贴图,也是为了以后在生成贴图的时候有一个调节的空间,比如说我就是想要一个平的地面,做的时候给的高度太大就不合适了。所以这里的高度只给基础的,剩下的先用渲染器调整来实现,当然,这里还是要看个人习惯和经验。教程的内容也不一定要完全遵守的。

这一篇笔记中,我们做了一个非常粗糙的高低变化,来模拟泥土地面最基本的高低变化。接下来的工作,就是不停的细化这个高度通道。

(完)

Leave a Reply