【UE4_001】后期处理轮廓描边效果

简介

 

通过材质计算得到物体边缘,通过后期处理的方式对物体边缘进行描边显示

ue4 材质描边、外发光、轮廓线_哔哩哔哩_bilibili

Unreal Engine 4 卡通轮廓线(Toon Outlines)教程 之 后期处理法(Post Process Outlines)_开发游戏的老王的博客-CSDN博客

实现思路

首先创建一个材质,使用边缘检测的方法,利用场景中物体深度不连续性,得到场中物体边缘。

通过后期处理盒子来渲染轮廓线的效果。

通过控制物体的CustomDepth的开启与关闭动态的开启或关闭物体的轮廓线的显示。

后期处理材质

材质函数 MF_Kernal

边缘检测需要通过卷积计算实现,需要对视口逐像素进行卷积计算,将卷积核封装材质函数,通过材质函数获取中心像素以及上下左右的四个像素,作为卷积核进行运算。

材质函数命名为MF_Kernal,为函数添加五个output,分别对应中心像素,偏上像素,偏下像素,偏左像素,偏右像素。

 

添加FunctionInput节点,用于控制轮廓线的宽度,将输入值设置为Scalar,并设置一个浮点数作为默认输入值作为偏移量。

 

添加SceneTexelSize节点,获取屏幕的像素尺寸,例如1920*1080的屏幕,那么U方向上每个像素就占1/1920≈0.000521,V方向上每个像素占1/1080≈0.000926,那么SceneTexelSize的值就为(0.000521,0.000926)。

 

添加ScreenPosition获取ViewportUV,此处获取了Viewport内所有像素点的UV值,默认视口左上角为(0,0)右下角为(1,1),因此在U方向上加(+1)是向右移动,U方向上(-1)是向左移动,V方向上(+1)是向下移动,V方向上(-1)是向上移动。

 

创建两个float2,作为偏移的方向,(1,0)在U方向上偏移,(0,1)在V方向上偏移。

 

MF_Kernel总体蓝图

  • Float2(方向) * Input Width(偏移量) * SceneTexelSize(屏幕像素大小) = 像素向某个方向偏移的距离。
  • 像素向某个方向偏移的距离 + ViewportUV(视口UV) = 偏移后的视口UV值
  • 最终的五个输出项
    • Center = 视口UV值
    • Right   = 视口向偏移一定宽度的UV值
    • Left     = 视口向偏移一定宽度的UV值
    • Up       = 视口向偏移一定宽度的UV值
    • Down  = 视口向偏移一定宽度的UV值

 

M_Outline

创建材质,在details面板将材质作用域设置为PostProcess,材质的Blendable Location 设置为 Before Tonemapping

 

添加SceneTexture节点设置为Depth,选择SceneDepth对全部场景物件进行计算,选择CustomDepth仅计算开启CustomDepth的物件。将MF_Kernel中的得到五个veiwportUV分别输入到SceneTexture中获得每个像素点对应的深度值。

SceneDepth:获取场景中所有物件的深度值

CustomDepth:获取打开CustomDepth通道的物件的深度值

添加SceneTexture节点设置为PostProcessInput0,获取场景中物件的在场景照明中的颜色。

PostProcessInput0:提供HDR的场景颜色

PostProcessInput1:提供分离透明度(Alpha通道是Mask)

PostProcessInput2 :低分辨分辨(Low Resolution)泛光输入

M_Outline总体蓝图

  • 添加一个标量(width),提升为参数,作为MF_Kernel的输入参数,用于控制轮廓线的偏移宽度。
  • 将MF_Kernel所得到的值,作为SceneTexture: CustomDepth的输入值,得到视口每一个像素的深度值。
  • 拉普拉斯边缘检测计算,中心值*4 减去上下左右四个像素的和,得到物体深度变化的而产生的边缘。使用clamp将值限制在0-1的范围内。
  • 将得到边缘值作为了Lerp的Alpha参数输入,在边缘的地方显示用户定义的颜色,在非边缘的地方显示场景本身颜色
  • 给颜色的输入值乘一个标量(Power)用来控制颜色的发光强度。

蓝图控制轮廓线

添加后期处理盒子

将刚刚创建的主材值,创建一个材质实例M_Outline_Inst,方便对于材质效果参数的调节。

在场景中添加一个后期处理盒子,在后期处理盒子Rendering Features -> Post Process Material新建一个材质插槽,将刚刚创建的材质实例添加到插槽中。

将后期处理盒子的应用范围设置为 Infinite Extent

 创建Actor蓝图

  • 控制蓝图逻辑

当按下X键时,开启全部物件轮廓线,当松开X键时,关闭全部物件轮廓线

  •  轮廓线开启效果
  •  轮廓线关闭效果

 

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现轮廓描边效果,可以使用ShaderMaterial来为目标物体添加一个轮廓材质。以下是一种实现轮廓描边效果的方式: 1. 首先,在着色器中使用Sobel算法来检测物体表面的边缘。 2. 根据Sobel算法的输出值来确定哪些像素属于物体表面的边缘。 3. 将边缘像素的颜色设置为轮廓材质的颜色,将非边缘像素的颜色设置为目标物体的颜色。 4. 将轮廓材质应用到目标物体上。 下面是一个简单的实现例子: ```glsl // 顶点着色器 varying vec3 vNormal; void main() { vNormal = normal; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } // 片元着色器 uniform vec3 outlineColor; varying vec3 vNormal; void main() { vec3 edge = vec3(1.0) - abs(vNormal); float edgeFactor = (edge.x + edge.y + edge.z) / 3.0; vec3 color = mix(outlineColor, vec3(1.0), edgeFactor); gl_FragColor = vec4(color, 1.0); } ``` 在这个着色器中,我们使用了一个Sobel算法来检测表面的边缘。我们计算了法线向量的绝对值,并将其与1.0相减,以获得一个表示边缘的向量。然后,我们将这个向量的平均值作为边缘因子来混合轮廓颜色和目标物体颜色。 在使用ShaderMaterial时,我们可以将这个着色器编译并将其应用到目标物体上。同时,我们还需要设置轮廓颜色和其他材质属性(如透明度、混合模式等)。 ```javascript const outlineMaterial = new THREE.ShaderMaterial({ uniforms: { outlineColor: { value: new THREE.Color(0x00ff00) }, }, vertexShader: vertexShader, fragmentShader: fragmentShader, }); const object = new THREE.Mesh(geometry, material); object.add(new THREE.Mesh(geometry, outlineMaterial)); ``` 这里我们将轮廓材质添加到了目标物体的子对象上,这样它就能够在目标物体周围形成一个轮廓
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值