Post

UE5 描边效果

1. 自定义深度缓冲区

1.1 缓冲区

引擎将三维物体渲染到屏幕上的过程(渲染管线)中,所用到的一系列中间缓存

1.2 场景深度缓冲

储存物体上的像素到摄像机距离的缓冲区,像素距离摄像机越近,深度越浅,在编辑器对应视图中越黑

1.3 自定义深度缓冲

只有设置了 渲染自定义模板通道 选项的网格体才会在此缓冲区中拥有深度值,且深度值为手动指定值,其他未开启自定义模板并未指定深度值的物体,以及空白区域,深度值将会是一个非常大的值

使用前,需要将 项目设置-引擎-渲染-后期处理-自定义深度模板通道 设置为 启用模板

2. 理论

假设现在要对自定义深度缓冲中,一个像素周围的八个像素求和,如图(假定未设置模板深度值的像素深度值为1000,网格体设置的自定义模板值为1),当像素不在物体上时:

PixelOutMesh

当像素在物体边界上时:

PixelOnMeshBorder

当像素在网格体内部时:

PixelInsideMesh

显然,这三种情况的求和结果分别为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做坐标,例如:

GetSurroundTexel

(待完善)

This post is licensed under CC BY 4.0 by the author.