UE5 描边效果
1. 自定义深度缓冲区
1.1 缓冲区
引擎将三维物体渲染到屏幕上的过程(渲染管线)中,所用到的一系列中间缓存
1.2 场景深度缓冲
储存物体上的像素到摄像机距离的缓冲区,像素距离摄像机越近,深度越浅,在编辑器对应视图中越黑
1.3 自定义深度缓冲
只有设置了 渲染自定义模板通道 选项的网格体才会在此缓冲区中拥有深度值,且深度值为手动指定值,其他未开启自定义模板并未指定深度值的物体,以及空白区域,深度值将会是一个非常大的值
使用前,需要将 项目设置-引擎-渲染-后期处理-自定义深度模板通道 设置为 启用模板
2. 理论
假设现在要对自定义深度缓冲中,一个像素周围的八个像素求和,如图(假定未设置模板深度值的像素深度值为1000,网格体设置的自定义模板值为1),当像素不在物体上时:
当像素在物体边界上时:
当像素在网格体内部时:
显然,这三种情况的求和结果分别为8000,1007和8,将这三个数减去一个较小的常数,例如100,结果的正负性分别为正数,较小的正数和负数,由此,可以大致判断一个像素相对于物体的位置,从而,使用在物体边界和物体内部的像素,减去物体内部的像素,就可以得到物体边界上的像素
3. 实际执行
3.1 设置自定义缓冲
将 项目设置-引擎-渲染-后期处理-自定义深度模板通道 设置为 启用模板,并使需要应用描边效果的物体渲染自定义深度
3.2 Post Process Volume
在场景中添加 Post Process Volume/后期处理体积
,设置范围为无限大或者手动调整所需大小,只有在后期处理体积覆盖范围中,设置的后期处理材质才会生效
3.3 后期处理材质
创建新材质,并将材质的 Material Domain
属性更改为 Post Process
,将此材质添加到 后期处理体积
属性中的 后期处理材料/PostProcess Materials
队列中
在此材质中,获取 Scene Textrue
并将其属性中的 Scene Texture Id
设置为 CustomDepth
以获得场景中的自定义深度信息
3.3.0 纹素
纹素 - 维基百科,自由的百科全书 (wikipedia.org)
在材质(纹理空间)中,操作和处理的基本单元为 纹素(Texel)
而非图像中的 像素(Pixel)
3.3.1 在材质中获取当前纹素UV坐标
UV坐标定义:屏幕左上角为 UV(0, 0),向右 U 坐标增加,向下 V 坐标增加
使用 ScenePosition
节点获取当前纹素在视口中的UV坐标
3.3.2 获取当前纹素周围的纹素
使用 SceneTexelSize
节点获取当前视口纹素大小,对节点输出进行 Mask ,R通道为U方向大小,G通道为V方向大小,通过这两个值,使用 append 节点,可以获得对应的 (U, 0) (-U, 0) (U, V) 等方向数组,将当前纹素位置(通过 ScreenPosition 节点获得)与这些方向数组相加,可以得到当前纹素周围的8个纹素UV做坐标,例如:
(待完善)