UE解决3DWidgetComponent颜色发白,变暗
UE里3D Widget发白变暗怎么办?
先说结论:3D Widget 发白、发暗、颜色跟 UI 设计器对不上,几乎都是场景的"自动曝光"和"色调映射"在捣乱。 解决办法不是去关全局后期处理,而是用 Custom Depth Stencil 通道把 Widget 区域标记出来,再用一个后处理材质把这些区域"还原"回原始颜色。做完之后,World 里的 UI 颜色可以和 Photoshop 里的设计稿 1:1 对上。
WebNativeBrowser 是面向 UE 5.1–5.8 的高性能企业级跨平台 Web UI 插件。如果你的 3D UI 是用 Web 页面做的(数据大屏、数字孪生面板、HMI 仪表),同样会踩到这个坑,本文方案完全适用。
一、问题现象
把 Widget 放进 3D 场景(WidgetComponent)后,常见的三种翻车:
- 发白/发亮:在暗场景里,白色 UI 像自己会发光,边缘还带一圈泛光(bloom)
- 发暗:在亮场景里,UI 颜色整体被压暗,饱和度也变了
- 颜色对不上:明明设计稿是
#3A6FF2的蓝,跑到场景里成了另一个色
这不是你的 Widget 做错了,是它被场景的后期处理"重新加工"了一遍。
二、根本原因
UE 的渲染管线里,Widget 作为场景的一部分,会被下面三样东西影响:
1. 自动曝光(Auto Exposure / Eye Adaptation)—— 主因
UE 默认开启自动曝光,它会根据整个画面的平均亮度动态调整曝光值。
- 场景大部分是黑的 → 引擎认为"你在暗处",就把整个画面提亮 → 白色 Widget 被提得过亮,发白发灰
- 场景很亮 → 引擎把画面压暗 → Widget 跟着变暗
Widget 通常是 UI 里最亮的部分,所以它对自动曝光的"误判"最敏感。
2. 色调映射(Tonemapping)
场景颜色要经过 ACES / Filmic 色调映射曲线,才能从 HDR 转到显示器能显示的 LDR。这条曲线会压缩高光、改变颜色,Widget 的颜色也会被"过一道曲线"。
3. 伽马 / 色彩空间
Widget 的 sRGB 颜色在 HDR 线性管线里渲染,如果没处理好伽马,就会整体偏色。
一句话总结:Widget 被自动曝光调了亮度、被色调映射改了色、再叠加伽马问题,三层一叠,颜色就跑飞了。
三、完整解决方案(5 步)
第 1 步:开启 Custom Depth Stencil Pass
菜单 Edit(编辑)→ Project Settings(项目设置)→ Rendering(渲染)→ Postprocessing(后期处理):
- 找到 Custom Depth-Stencil Pass(自定义深度-模板通道)
- 改成 Enabled With Stencil(启用带模板功能)
这一步让引擎开始渲染"自定义深度 + 模板"通道,后面才能用它标记 Widget。
第 2 步:正常创建你的 Widget
按你平时的方式做一个 Widget Blueprint(UMG),里面放按钮、图片、文字都行。这里没有特殊要求。
第 3 步:创建 Actor 蓝图 + Widget 组件
- 新建一个 Actor Blueprint
- 给它添加一个 Widget Component(小部件组件)
- 选中这个 Widget Component,设置它的 Widget Class 为第 2 步做的 Widget
第 4 步:Widget Component 的关键设置
在 Widget Component 的 Details(细节)面板里,依次设置:
| 位置 | 属性 | 值 |
|---|---|---|
| Material | Widget Material(部件材质) | Widget3DPassthrough_Masked_OneSided |
| Advanced(高级) | Apply Gamma Correction(应用伽马校正) | 勾选 |
| Rendering → Advanced(渲染 → 高级) | Render Custom Depth Pass(渲染自定义深度通道) | 勾选 |
| Rendering → Advanced(渲染 → 高级) | Custom Depth Stencil Value(自定义深度模板值) | 200(可自定义) |
要点:
- Widget3D 材质:用引擎自带的
Widget3DPassthrough_Masked_OneSided,它是不发光、带 alpha 遮罩的材质,颜色最"干净" - Apply Gamma Correction:让 Widget 的颜色按 sRGB 正确显示
- Stencil Value = 200:这个数字就是给 Widget 打的"标记",后面材质里要用同一个数
第 5 步:创建后处理材质 + 挂到场景
这是方案的核心,分两小步。
5.1 新建材质
- 新建一个 Material(材质)
- 打开材质编辑器,左侧设置:
- Material Domain(材质域):
Post Process(后期处理) - Blendable Location(可混合位置):
Scene Color After Tonemapping(色调映射后的场景颜色)
- Material Domain(材质域):
5.2 搭材质图
核心逻辑只有一句话:读取模板值,凡是等于 200 的像素就是 Widget,把它的颜色还原;其他像素原样不动。
需要的关键节点:
SceneTexture(场景纹理)→ 选 CustomStencil:读取每个像素的模板值- 常量
200:改成你在第 4 步设的 Stencil Value - 比较/
If节点:判断"模板值 == 200",得到 Widget 遮罩(mask) SceneTexture(场景纹理)→ 选 SceneColor / PostProcessInput0:读取当前场景颜色- 对 Widget 区域的颜色做反自动曝光 + 反色调映射处理(还原)
Lerp或If节点:mask 为 1 时输出"还原色",否则输出原场景颜色
关于"自动曝光 / 眼睛适应修复":这是整个图里最绕的一步。因为混合位置选的是 After Tonemapping,材质拿到手的场景颜色已经被自动曝光和色调映射处理过了。要把 Widget 还原,就得在材质里把这两个影响"抵消"回去——这一步会用到读取曝光相关的数据做逆运算。
5.3 挂到 PostProcessVolume
- 在场景里放一个 Post Process Volume(后期处理体积)
- 选中它,在 Details(细节)面板 → Post Process Volume Settings 里勾选 Infinite Extent (Unbound)(无限范围/无边界)——这一步很关键,勾了它体积就不用调大小,全场景生效,UI 在哪儿都能覆盖到;不勾的话,体积太小会盖不住 UI,导致材质"看起来没反应"
- 找到 Rendering Features → Post Process Materials(后期处理材质),点 Add
- 选择你刚创建的材质
四、为什么这样做有效
这套方案的本质是"绕开后期处理,而不是关掉它":
- Custom Stencil = 200 相当于给 Widget 像素贴了个"身份标签"
- 后处理材质在画面最后阶段(After Tonemapping)运行,专门把带这个标签的像素捞出来还原
- 场景里其他物体照常走自动曝光和色调映射,不受影响
所以你不会像"直接关自动曝光"那样牺牲全局画面效果,而是精准地只修正 UI 区域。
五、注意事项
- Stencil Value 要前后一致:第 4 步组件里设的
200,和第 5 步材质里的常量必须相同。你想用 3、128、255 都行,关键是别对不上。 - 模板值别冲突:如果你项目里其他地方已经用了 Custom Stencil(比如描边、遮挡效果),记得给 Widget 挑一个不冲突的值。
- 记得开无边界模式:Post Process Volume 忘了勾
Infinite Extent (Unbound),而体积又比较小,就会盖不住 UI、材质不生效,容易误以为"方案没效果"。 - 这是"World 内 3D UI"的方案:如果你用的是普通屏幕空间 UI(Add to Viewport),本来就不经过场景后期处理,用不上这套。
- 暗场景更明显:自动曝光在明暗差异大的场景里最活跃,这类场景下这个方案提升最明显。
六、和 WebNativeBrowser 的关系
如果你是用 WebNativeBrowser 把网页(数据大屏、数字孪生面板、工业 HMI)渲染成 3D Widget 放进场景,会遇到一模一样的发白发暗问题——因为 Web 界面本质上也是被 WidgetComponent 渲染进 3D 世界的。
此时本文方案同样适用:给承载 Web 界面的 WidgetComponent 设好 Stencil Value,再用同一个后处理材质还原,Web UI 的颜色就能和浏览器里看到的一致。
如果这篇帮你解决了 3D Widget 发白发暗的问题,欢迎点赞收藏。WebNativeBrowser 支持 UE 5.1–5.8,覆盖 Windows / Linux x86_64 / Linux ARM64,已完成国产 GPU 专项适配。
GitHub:https://github.com/starTechnology1994/uewebbrowser
商务合作 / 授权咨询:startechnology1994@163.com
浙公网安备 33010602011771号