概述
用Ta做shader的思维来思考如何做一个效果
想写这篇文章很久了,之前也有出视频给大家演示过,但感觉没有写文章更能表达这个想法
为什么要用Ta做shader的思维来思考
很多时候,在做后期合成的时候,大家的思路都是想怎么用一些节点、插件、素材去得到想要的效果。这其实是一种很典型的平面思维——画面是“拼”出来的,层与层之间靠 alpha 叠加,效果靠节点串联,素材靠导入替换。它默认了一个前提:每个元素都是独立的图像,合成就是把它们摞在一起。
但三维合成不一样。三维合成从一开始就承认,画面里的每个像素背后都有位置、深度、法线信息。这些东西不是“素材”,而是数据,我们称之为信息通道。数据是可以被计算、被传递、被复用的。这时候,与其继续用平面和图像的思路去堆节点,不如换一种 TA 的思路去思考:我想要的这个效果,本质上是哪种计算?我手里的这些数据能不能把它算出来?
而且这个思路有一个很直接的来源——游戏。游戏实时渲染里早就跑着一大堆基于三维数据的效果,MatCap、Normal Relight、深度偏移边缘光、波普点阵、半调网点,特效消散……这些在游戏里都是很常见的效果,而且是靠深度、法线、位置这些通道算出来的。换句话说,游戏已经把这条路走通了,我们只要找到对应的分享文章即可直接做出对应的效果。同时我们又拥有后期的平面,可以在这个效果上面叠加更多的效果得到更细更好的结果。
所以做后期合成的时候,完全可以换个心态:不是“我要怎么做一个效果”,而是“游戏里这个效果是怎么算的,我能不能直接拿过来”。MatCap 拿过来,就是用相机空间法线处理成0~1范围后采样一张球面图;Normal Relight 拿过来,就是用现有法线dot一个灯光方向向量;波普点阵拿过来,就是用Normal Relight控制Position通道里每格的点大小,同样的数据,同样的算法,我们可以在nuke直接得到相同的效果。
案例
深度偏移边缘光
这个是知乎上一个大佬的原理文章,原理总结就是拿原来没偏移的depth减掉偏移了一定数值的depth,我们就能得到比较好看的边缘光
nuke实际操作
- 取出depth,用原来的depth连入merge节点的B接口,一个连transform节点做偏移,Merge节点选择from(减法)模式,我们就可以得到下图的结果
- 用keyer节点调整数值,我们就可以得到一个比较好的边缘光mask,连入grade调亮即可得到边缘光效果
- 可以通过调整Transform来调整边缘光出现的方向
- 直接调整Transform比较麻烦,我们可以选中这些关键的计算节点以后打个组,新建两个2d Positon Knob,一个叫light_dir表示灯光方向,一个叫center表示物体位置,再建两个Float Knob,一个叫X_Width,一个叫Y_Width,用来控制边缘光的上下粗细和左右粗细我这里讲一下大概思路,因为Transform向左偏移左边出现边缘光,向右偏移右出现边缘光,上下同理,Transform向左偏移是负数,向右偏移是正数,上下同理那么当light_dir在center左边的时候,light_dir的x-center的x为负数,反之为正数,light_dir在center上边的时候,light_dir的y-center的y为正数,反之为负数,这不就是跟我们需要的上下左右偏移的正负相同吗,所以就是x=light_dir的x-center的x,y=light_dir的y-center的y,这就是center到light_dir的向量(矢量)但直接使用他们相减的数值给tranfrom太大了,我们其实只想要这个方向,那么我们就把这个向量转为模为1的单位向量,这样他的x,y永远都在(-1,1)区间,最大也就只能是1直接问ai