UE4 基于屏幕空间的描边材质

首先,看需求是什么,是否要透视,是内描边还是外描边。根据不同的需求都会有不同的思路。

为什么是在屏幕空间呢,据法线做当然是可以的,但是如果需求上不能这么做,例如法线很乱,什么光滑组什么破玩意的,那就只能只用基于屏幕空间来做了,而为什么在其他空间没有办法做呢,目前认为是因为没办法做边缘检测,只能知道自身的信息,所以才只能在最后做,现在不太清楚虚幻的渲染流程是什么样的,所以不敢妄加推断。

在UE4中,我们有两种思路来做
在这里插入图片描述

  1. ScemeTexture:CustomDepth

  2. ScemeTexture:CustomDStencil

第一个需要在mesh上开启renderCustomDepthPass

![image1.jpeg][2]

第二个需要:

![image2.jpeg][3]

然后把我们的材质做好后放在postprocessVolume的PostProcessMaterial中就可以了。设置后这个设置就是全局的啦。

第一种方法是自定义深度,然后深度和周围的像素深度进行比较,如果是边缘那么就发光。第二个是自定义模板,跟深度做法上是一样的,并且更加的灵活和复用,毕竟只要开启自定义深度就只能使用全局设置,这样也只能有一种颜色。

那么如何检测边缘呢,基本的思路就是在屏幕空间中,自己不是模板值,而周围是模板值,那么这样就说明是外边缘,反之是内边缘。
![image3.png][4]
我们可以通过编辑器选择试图来看。

![image4.png][5]

我们使用如上图的方式来实现检测单个点的像素是否是mask。

![image5.png][6]
所有的蓝图如上图。

最后一个问题就是随着视角的拉远,边缘光的像素并不会根据视角而缩小,最简单的就是随远近缩小

![image6.png][7]

如果有更新以后再改把

### UE4 中为半透明材质物体实现轮廓高亮效果 为了在 Unreal Engine 4 (UE4) 中为具有半透明材质的物体实现轮廓高亮效果,可以采用多种技术组合来达到理想的效果。以下是具体的方法: #### 方法一:使用自定义深度缓冲区 通过启用自定义深度写入功能,可以让半透明对象也能被检测到并绘制其轮廓。 对于需要显示轮廓的对象,在材质编辑器中的属性面板找到“Material Domain”,将其设为“Deferred”。接着勾选“Allow Custom Depth Write”选项[^4]。此操作使得即使是在半透明的情况下,也可以向自定义深度缓冲区写入数据,从而支持后续基于深度信息的边缘检测算法。 ```cpp // C++代码片段用于设置Actor组件上的自定义深度属性 UStaticMeshComponent* MeshComp = GetDefaultSubobject<UStaticMeshComponent>(TEXT("MyMesh")); if(MeshComp){ MeshComp->bRenderCustomDepth = true; } ``` #### 方法二:构建专用描边材质 创建一个新的材质资源,并调整其配置以适应特定需求。将混合模式更改为“Masked”或“Translucent with Masking Support”。 - **Masked Mode**: 可以为不完全透明的部分提供更好的控制力。 - **Translucency Settings**: 如果希望保留原有的半透明白色,则应保持默认值不变;如果想要改变整体外观,比如增加模糊度或其他视觉特效,则可进一步修改这些参数。 在此基础上添加一个颜色输入节点作为描边的颜色源,并连接至最终输出之前的位置。确保该颜色仅影响边界区域而不是整个表面[^1]。 ```c++ // Blueprint脚本逻辑示意 void ApplyOutlineEffect(AActor* TargetActor, FLinearColor OutlineColor) { UMaterialInstanceDynamic* DynamicMatInst = UKismetMaterialLibrary::CreateDynamicMaterialInstance(this, BaseMaterial); if(DynamicMatInst != nullptr) { DynamicMatInst->SetVectorParameterValue(FName(TEXT("OutlineColor")), OutlineColor); // 应用动态实例化后的材质给目标Actor下的所有Mesh Component for(USceneComponent* Comp : TargetActor->GetComponentsByClass(UStaticMeshComponent::StaticClass())) { CastChecked<UStaticMeshComponent>(Comp)->SetMaterial(0, DynamicMatInst); } } } ``` #### 方法三:利用后期处理体积与屏幕空间法线 结合后期处理体积(Post Process Volume),可以通过捕捉当前帧图像的空间梯度变化来进行实时边缘增强。这种方法不需要额外准备特殊的几何结构或者纹理贴图,而是依赖GPU计算能力直接作用于渲染管线末端。 首先激活项目内的“Screen Space Reflections”特性开关,随后新建一个后置链式着色器(Post-process Chain Shader),编写一段GLSL/HLSL程序负责识别亮度突变处即为我们所期望得到的轮廓位置[^3]。 最后一步是把上述三种策略综合起来形成完整的解决方案——先由CPU端告知哪些实体应当接受特殊对待,再交由GPU执行具体的图形变换任务,期间巧妙运用各种缓存机制提高效率减少冗余运算量。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Papals

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值