03_描边追加

添加描边

新增描边材质

先随便给个黑色 开启背面剔除 复制几个材质给面部身体

添加实体化

这些调整实际上就是把实体化参数全部归零

添加新的顶点组

添加新顶点组,表示生成的新顶点 指定给实体化修改器,这样就得到实体化生成的一个顶点组 添加几何节点 几何节点,取出刚才的组里的点 在添加一个描边材质的组 编辑模式下根据材质,选择脸的部分,然后再顶点组里面标记权重为1 同理,头发和饰品权重标记为0.7,记得点指定 然后衣服选中,标记为0.3

几何节点

提取OutlineMask数据 与实体化生成的顶点数据进行比较 添加组输入 修改类型 此时修改器面板需要指定材质 根据权重数据,设置不同材质 添加描边宽度参数 设置描边法线外扩 输出 此时描边还是断开的,需要读取平滑法线进行修复 可以使用按距离合并,能用,但会有瑕疵,使用UV中的平滑数据就不会这样,当前这里是偷懒的办法

加入相机深度

添加相机并设置FOV 几何节点计算相机到物体深度 这里注意一点,ViewDir在这里和Unity中不太一样,这里是相机指向物体,而Unity和UE都是处理成物体指向相机,本质其实差不多,只是计算CameraForward就需要取Vector(0,0,1,1) 计算ViewDir 对于Blender的相机面向的是负Z轴方向,所以取Vector(0,0,-1,1)进行偏转获得CameraForward向量 ViewDir和CameraForward进行dot获取深度,也就是相机和物体距离在CameraForward方向上的投影长度,这样可以规避旋转的影响,计算ViewDir在CameraForWard方向上的投影,然后钳制到0~1 UE单位是CM所以是钳制到100,而Blender是M所以是钳制到1,1m内随屏幕占比缩小或放大,描边适当放大或缩小不至于消失或过粗,1m外就随屏幕占比而缩小 接入描边粗细控制,这里乘上45是FOV的值,因为在相机中物体做了透视投影,这里希望与FOV进行关联

加入顶点描线Z偏移

新增参数 这里获取偏移方向 顶点位置在裁剪空间下Z偏移等价于世界空间下延视线方向偏移 进行归一化得到偏移方向的单位向量,然后乘上ZOffset的值就是偏移量 因为只有面部需要偏移,所以需要混合设置,在这里获取混合因子 然后与原输出法线外扩的数据进行相加就行了 此时还是有瑕疵,转动视角描边有问题

描边问题修复

描边问题出在,几何节点中的Position是模型空间下的,而相机位置是世界空间下的,这里注意,虽然说相机位置显示的坐标是和世界坐标一致,但它其实是观察坐标系

世界变换

在旧的版本中,ObjectInfo是没有Transform选项的,所以需要手动计算变换,进行矩阵变换 这里先处理点位置,这里是属于仿射变换,包括平移,旋转,缩放 手动转换,这里先对位置进行处理相减,然后反向旋转,最后处理缩放 新版Blender可以使用转换矩阵进行转换 这里直接获得物体空间到世界空间的逆矩阵,这样就获得了物体空间矩阵,将相机位置转换到物体空间,就和Position同一空间了 除了将相机位置转换到物体空间,也可以反过来,将Position转换到世界空间 取世界空间矩阵进行空间变换,获得世界空间下的顶点位置PositionWS,这样也可以计算,但这里需要注意,转换后的PositionWS和CameraPos还是不是同一坐标系,还是需要对CameraPos进行处理 这里将原位置改为相对位置就可以了 最后还有就是对于向量的变换,属于线性变换,我们只需要处理旋转和缩放就行 这里是选择全部转换到物体空间,因为步骤较为简单 取出旋转的逆 这里对CameraForWard向量进行变换,转换到物体空间

除开变换额外的问题

到这里描边修复基本完成,但依旧还存在问题,那就是仅在相机视角观察是对的,因为这里取的是活动相机位置 当前是相机里面观察 这里是不用相机 转动视角,描边出现问题,这里不修其实也无伤大雅,因为渲染仅在相机中渲染,是不会影响最终输出的,如何想要预览正常,在新版中也可以修改

调整描边生成方式修复预览

断开几何节点输出,创建StoreNamedAttrbute存储属性进行输出,将Name设置为Outline,Value设置为1 找到描边的材质,在里面进行处理,读取刚才几何节点传出的属性 计算深度并打组 添加参数,描边宽度 获取描边外扩 计算ZOffset,这里需要将相机位置转换到世界空间 混合输出 修改组名称并输出 这里输出后还是没有效果,需要调整材质面板设置 这时面部描边就生效了,先把节点组复制所有的描边材质 最终预览,注意除了面部,其他部位不需要ZOffset

两种生成方式

几何节点是CPU计算,而在Shader中有GPU加速所以会渲染快很多,看帧率都看的出来,而且Shader里面是没有瑕疵的

描边颜色混合

导入贴图

这里设置采样颜色模式为无SRGB DataTex打组 创建描边自发光Shader,这里进行区域判断和颜色混合 解码DataTex判断是否是Body部分,只有Body部分是分了很多材质,描边颜色不一样 如果是Face部分,就输出ID=0,进使用Color1进行设置颜色 计算材质ID,这里第一个乘应该是x5不是4 如果材质域是Body,会进行混合颜色 将输出颜色压暗

描边完整节点

注意要调一下材质域,衣服部分使用是OtherDataTex的Color2输入,除了面部模型的OutlineShader组的Color1是粉色FF8181,其余都是灰色555555

最终描边效果

为什么使用实体化修改器而不是直接几何节点合并操作

如果合并的话,原模型的自定义法线会被修改,这里进行合并 合并前 合并后 使用实体化来进行描边的权重注册,这里指定了顶点组,是为了让实体化出来的顶点进行注册权重,可以理解为是取原来模型的那一部分顶点进行实体化,并修改权重 在几何节点中判断权重,这样取的实体化修改器法线外扩的顶点信息


Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • URP - RendererFeature :ScreenSpaceOutline
  • 平滑法线处理 - 八面体映射
  • Lv.3 Unity主线:一个简单的PBRShader
  • 理论支线:直接光漫反射与GGX高光的混合问题
  • 理论支线:PBR - 基于图像的照明( image based lighting-IBL)
  • # #