半透明物体的描边和投影

正在学习unreal的材质,有些不一定到位

前提知识交代

  • SceneDepth
  • CustomDepth
  • PixelDepth

这几个概念是这个文章里比较重点的,至于stencil的话,以后再说吧!

直接进入正题吧!

项目前提

创建一个空的场景

SM_MatPreviewMesh_01TextRenderActor删除!

创建一个Actor(Name=”TestActor”)

添加两个StaticMesh,一个改名为Outline,一个为Mesh

为这两个StaticMesh添加同一个mesh(如果对ue比较熟悉的可以不样!)

Mesh的设置改成下图

Outline的设置改成下图

SceneDepth

为了方便展示SceneDepth是什么样的,目前我能想到有两种方式

  • 直接使用G-Buffer
  • 使用postProcess将其渲染出来!

G-Buffer

整个场景的深度!

postProcess

创建一个PostProcessVolume,将该Volume设置成全局生效!

创建一个材质,设置为PostProcess

然后将该材质放置到Volume中!

此后,我们就能在场景中看到sceneDepth的效果了!(记得要从G-Buffer中切回Lit

神奇的区域

 解决方法:

CustomDepth

CustomDepth的方法和SceneDepth一样

G-Buffer:

PostProces:

PixelDepth

PixelDepth好理解,就是正在渲染的像素点的深度,需要注意的是,如果是透明的物体,因为没有遮挡的问题,同一个像素点会有多次渲染,每次的深度也有可能不同(因为光栅化后,距离相机远的点也需要渲染!)

半透明材质的描边

  • 直接基于CustomDepth的处理
  • PostProcess的处理

基于CustomDepth的处理

创建一个半透明的材质(Name=”Mat_Tran”),将其模式改为Translucent;

然后开放自定义深度的写入

如果没有开放Allow Custom Depth Write的话,在G-BufferCustomDepth中我们是看不到的!

简单处理一下半透明的材质;

将该材质应用到Mesh(前文已经说了,可以回去看看 项目前提 )中

准备Outline

创建一个的材质(Name=”Mat_Outline”),将其模式改为Translucent;这个材质不需要开放CustomDepth的写入。

比较简单的逻辑,这里就不细说了,如果真的是0基础,多调整几下参数,用笔算一下就可以了。

Mat_Outline放置到Outline中,我们就能看到下图的效果,

注意事项:

因为Tonemapper的影响,有时候颜色变化貌似不是自己理想中的样色,所以可以暂时取消后看效果!

PostProcess的处理

这里就有点难度了,一般都是用到卷积,卷积怎么回事我就不说了,放link;

https://blog.csdn.net/SittingAtThisMoment/article/details/83716251

我这里基本是照着做的

效果: