【转载】UE4 豆知识 - CustomDepth 及相关数值

1,123 阅读3分钟

原文链接:UE4 豆知识 - CustomDepth 及相关数值

*Creation Date:0318
*Author:Erica
*Catalog:Material; Unreal4
*Abstract:CustomDepth; PixelDepth; SceneDepth; CustomStencil

Preface:

常用概念扫盲,目前找到的参考没有说的很清楚的,于是自己写一写。

需要的前置知识包括 UE4 材质编辑器的基础使用,认识节点和渲染管线。

概念介绍:

PixelDepth (像素深度)

当前被渲染的这个像素点与摄像机的距离。该节点没有输入接口,说明这个节点不能够获取特定位置的深度,只能获取像素着色器目前处理的这个像素点(的深度)。

最基础的深度概念,我们说起深度时默认指的就是 PixelDepth

SceneDepth (场景深度)

场景深度,当前场景的深度信息映射到屏幕上的一张图,从输入值有 UV 这一点来看就知道它是基于屏幕 UV 且可以获取非当前像素深度的。比较经常用在屏幕后处理里面。

只有半透明材质才支持场景深度。当然后处理材质也可以用,因为这个限制与图形渲染管线的顺序有关,先渲染不透明材质,半透明材质才能够在后面获取到写有深度的 Buffer 。

CustomDepth (自定义深度)

通过 SceneTexture 节点获取,用在屏幕后处理中,只需要在指定的物体上开启 “渲染自定义深度通道” 即 “Render Custom Depth”,该物体的 PixelDepth 就会被渲染到一张单独的 Buffer 中。

这张 Buffer 是一张与 SceneDepth 很相似的 Buffer,不同的地方在于它将没有开启 CustomDepth 的区域扣掉了,用一个极大的值去填充(10^8) ,得到了一张只有 CustomDepth 区域有效的 Buffer。

CustomStencil/CustomDepthStencil (自定义模板/自定义深度模板)

不要被它称呼中带有的 Depth 迷惑了(血泪教训),它根本不是深度值,而是一个模板值,这个模板值就是在细节面板设置的一个 1-255 的整数值,从个人的使用体验来讲它就像是一个图层的标识,可以将物体分类处理。

差异

PixelDepth VS SceneDepth

SceneDepth 很好理解,就是一张写入了屏幕上每一个像素距离摄像机的距离的图片,可以找到很多示例,注意深度值一般要除以 3000 左右的数值来使深度值在 0-1 范围内才能直接输出到材质的 BaseColor 节点上 Debug 。

PixelDepth 不是一张图,只是一个点而已,它对其他像素的深度一无所知。

SceneDepth VS CustomDepth

就是把不需要的地方涂掉,看图就比较好理解了。

CustomDepth VS CustomStencil

假设图中三个物体都被开启了在 CustomDepth 通道中渲染,并且设置了不同的模板值,那么在材质里就可以获取它们的模板值并且分别处理。

其他备注

在视口左上角的视图模式可以在缓冲显示的子菜单里找到 CustomDepthCustomStencil 的可视化,可以通过这个菜单检查自定义深度和模板开启情况和具体数值。注意在 ES3.1 情况下是看不到缓冲可视化的,记得关闭 ES3.1 再进行检查。

启用 CustomDepth 需要在项目设置 - Rendering-Postprocessing 中启用自定义深度-模板通道

这里深度和模板是分开开启的,“已启用” 选项意味着 只启用深度而禁用模板,需要注意一下,如果设置了模板、能够看到自定义深度,却看不到模板可视化图像,可以检查一下项目设置。