【UE】材质与半透明 - 00.什么是半透明材质

本系列将聚焦于各种实用的透明效果案例实现,每篇文章篇幅不会很长。

但在讲案例之前,需要先补上一些重要的前置知识------透明材质是什么,UE 中"透明"到底意味着什么。


现实中的透明是什么?

要理解引擎里的透明,我们必须先回到现实世界,看看自然界的光学现象。

如果在 UE 中,你认为这些物体的透明度是多少呢?

在日常生活中,人们会凭直觉将物质分为:不透明 半透明 透明

我们在游戏或渲染材质里也常常设定一个"透明度"参数。但要理解的是,这并不是一个严格的物理量。

在现实中,没有单一的物理量叫做"透明度"。所谓透明现象,是光与物质发生多种复杂相互作用的综合结果------涉及折射、散射、吸收、表面反射、表面粗糙度等多个因素。

现实光学中,更准确描述透光能力的量是透射率(Transmittance),即光线穿过介质后的能量比例。

图示箭头代表光线传播方向。

这是一个高度简化的模型:

  • 光线在介质内可能多次散射,不一定只从背面射出
  • 介质内部可能发生全反射,增加光程,引发更多吸收
  • 吸收距离并非固定,取决于材质的微观结构
    这些更复杂的机制,会在讲到 SSS(次表面散射) 时详细展开。

影响透射率的主要因素

  1. 材料吸收系数

    决定光在传播过程中被材料分子吸收的程度。吸收能量会转化为热或其它形式。

  2. 材料厚度

    Beer--Lambert 定律 ,厚度越大,透射光强呈指数衰减。

  3. 散射现象

    材料内部的微结构会导致光线路径偏折,减少直射光强。例如玉石、乳白玻璃会发生强烈散射,使透过的影像模糊。

  4. 表面反射

    折射率变化会造成部分光被反射。即使是优质玻璃,单个界面也会反射约 4% 的入射光(无镀膜)。

UE 中的透明是什么?

从"金属值"说起

听起来关乎透明的主题,却为什么会提到"金属值"?

没错,因为透明与金属的光学本质,其实有共通的物理来源。

考虑镀膜玻璃 这个例子:

即使是透明的玻璃,表面加上极薄的金属镀膜后,其反射率会大幅提高。

这是因为金属的光学行为是极端的导体案例

材料的复折射率 n+ikn + ikn+ik 中,消光系数 kkk 在可见光范围极大,意味着光进入极浅的深度就几乎被完全衰减。绝大部分入射光直接在表面被反射,少数透过镀膜的光才进入玻璃。

金属的反射机理

根据麦克斯韦方程组,导体的自由电子响应远强于介电体的位移电流。入射光在金属自由电子中激发强烈的感应电流,其电场与入射光存在约 90° 的相位差,导致大部分能量反射。

这导致除了转化为热的部分外,大部分光被反射(这就是金属镜面反射强烈的原因)。

不同金属的吸收系数随波长变化不同,这种选择性吸收与反射造成了颜色差异:

  • 金吸收蓝光,反射红黄光 → 呈金色
  • 铜反射红橙,吸收蓝 → 呈红铜色

回到镀膜玻璃,即使镀层极薄,仍能部分透光,但反射率显著提升。

透明的真实本质

那么之所以先提到"金属",就是为了引出他:

一切物体都是"透明"的

所有物体在某种意义上都是"半透明"的。

在真实世界中,物质的光学行为是连续的光谱分布,折射率、消光系数、吸收系数都会随波长平滑变化,不存在"绝对"两极分类。

当我们沿着真实物理继续探究时,会发现:"透明"才是更贴近世界本质的材质模型,反倒是我们习以为常的"不透明",只是为了实时计算而构建的抽象化近似。

区分是否透明,是技术上的折中

"不透明"是一种典型的技术折中,既规避了多余的渲染开销,又赋予了美术更高的可控性。

这看似"倒反天罡"的结论,就是 Shader,乃至整个图形学的本质:

  • 在有限算力下,实现最好的视觉

因此:

  • 图形学的艺术就是魔术的艺术
  • 看上去是对的就是对的

接下来的文章中,我们要牢牢记住这两条共识。在把玩"透明"的时候,我们非常需要依赖这样的思路。

透明材质

现在我们已经理解,在 UE 的材质系统中,

不同的混合模式(如 Opaque、Translucent、Masked)和着色模型,其实都是为了减少计算量而存在的技术折中。

真实透射率渲染的计算代价

但是这会有一个看似合理的疑问:

既然透射率是自然界的真实物理属性,为什么不让所有物体都按真实透射率渲染?

石头用低透射率,玻璃用高透射率,不就是更接近现实吗?

1.真实透射率渲染的计算代价

在物理正确的透明渲染中,我们至少需要处理:

  1. 光线的折射与反射分配(菲涅尔方程)
  2. 在介质内部的多次散射与吸收(Beer--Lambert + 相函数)
  3. 厚度与体积效应(非平面材质,光程变化)
  4. 透射后还要继续参与场景光照计算(光线继续传播到其它物体、再反射回来)

这意味着,每一个透明像素都可能:

  • 发出多条二次射线(Refraction + Transmission)
  • 多次进入材质内做体积采样
  • 在屏幕空间甚至需要回溯遮挡(Scene Color / Depth 比对)

这种渲染过程的时间复杂度通常接近:
O(npixels×nbounces) \mathcal{O}(n_{\text{pixels}} \times n_{\text{bounces}}) O(npixels×nbounces)

而如果我们假设材质材质不透明,在实时渲染中通常只有一次着色计算 O(npixels)\mathcal{O}(n_{\text{pixels}})O(npixels)。

2. UE 的渲染管线限制

在 UE 的实时渲染架构中:

  • Opaque 材质会被提前写入深度缓冲(Z-Buffer),从而后续的像素可以快速剔除(Early-Z Pass,性能极高)。
  • Translucent 材质无法参与这一优化,因为它需要依赖已经渲染的背景色(Scene Color),必须按屏幕顺序渲染,并且每个像素都要做混合(Alpha Blend),无法丢弃计算。
3. 透明材质引发的排序问题

透明材质渲染有严格的前后顺序要求

  • 如果先渲染背景,再渲染前景透明物体,混合才能正确。
  • 如果物体之间互相透明,必须进行排序(Depth Sort),否则画面会出错。

这在多物体场景中会让显存和 CPU 负担显著增加。

相反,不透明物体的渲染没有这个顺序约束,批处理效率高。

4. 多层透明的指数级负担

假设场景中有 5 层彼此叠加的半透明物体(比如玻璃窗后的水杯里的冰块):

真实透射率渲染意味着:

  • 每层都要读取并混合已经渲染的颜色数据
  • 每层的混合依赖前面所有层,不能并行
  • 多次的采样和混合叠加消耗显存带宽

性能消耗与透明层数几乎呈指数增长。

5. 实时渲染的取舍

由于透明渲染的这些先天缺陷:

  • 没有 Early-Z 优化
  • 需排序处理
  • 多次采样混合
  • 光线追踪近似计算

好吧你肯定没看,简单解释一下。

非透明只用渲染距离屏幕最近的一个面

而半透明,需要渲染所有的面,而且每个面的结果都依赖于更远的一个面的结果

这个排序需要对每一个像素进行多次的采样和混合叠加,非常消耗显存带宽。

如果不这样(实际算力做不到),就会造成排序问题:

如果不是为每个像素单独排序,而是以模型三角面为准呢?

那如图所示,红色面在前,还是白色面在前?

这很难说,以目前算力就只能做到这种程度

透明乱序是个难解的问题,以后单独会讲

项目设置中的这些选项,可以改变排序计算方式(并没有真正的"像素排序"规则)

材质细节中的光照模式,确定透明模型如何收到光照影响(·向前着色·为基于像素的解法)

透明材质是如何渲染

为什么半透明材质会有单独的排序设置光照设置

原因很直接:在渲染管线中, 计算飞快的不透明相对缓慢的半透明 是分开处理的。

渲染管线总览

首先看一下 UE 中的渲染管线流程:

1. 渲染非透明物体

假设场景中,有两个透明模型夹在两件不透明模型之间:

引擎会 优先渲染不透明物体 ,忽略半透明:

这一阶段会输出完整的 GBuffer 数据:基础颜色、法线、深度等。

有了这些数据,光照和反射几乎可以得到最终画面:

管线进度示意:

① 完成 GBuffer

② 完成光照计算

③ 完成反射

④ 得到最终画面

目前进度截至到最终画面

2. 渲染后处理阶段

得到最终画面后,下一步才进入 PostProcessing(后处理) 阶段。

那么,透明物体在哪里被计算呢?

半透明属于后处理 - Additional阶段与Post阶段

从管线图可知,半透明渲染 (Translucency)属于 附加 Additional 阶段,位于后处理 PostProcessing

Additional 阶段包括:半透明材质、体积雾等

虽然它出现在后处理之前,但本质上依赖已经完成的 GBuffer 数据,因此可以视为为一种"后处理式"渲染。
半透明①的渲染仅以附加 Additional的名义存在于后处理 PostProcessing②之前。

可以仔细的看看附加 AdditionalTranslucency的流程,Transparent 渲染基本上会头计算一遍半透明的光照与反射的计算

不过你可能会说,附加 Additional不是在后处理 PostProcessing②之前吗?为什么可以视为后处理?

半透明通道

实际上,我们可以在透明材质细节设置中使用半透明通道

通过这个设置,你可以让透明材质与自定义后期(Post Material)在渲染顺序上混合:

半透明Post完全混在一起,随意的更改透明在后处理阶段中的顺序

用一张示意图来描述的话,①和②都是相机前的一层层面片模型(面积填充相机画面):

①为排序后的半透明,每一层就是 一个 渲染的透明模型

②为Post中的各种特效和自定义特效,泛光,景深,动态模糊等,他们也是有先后顺序的

通过半透明通道可以调整每个透明材质(自定义后期处理材质也同样设置),在后期中的先后顺序,最终可以完全混编半透明与Post,因此可以说,半透明就是后期

使用半透明材质制作的后期效果

我们理清了半透明在管线里的地位。

那么回到示例,现在我们对半透明排序,然后由远到近渲染半透明

先渲染最远的

然后由后到前逐个向前渲染 ,直到完成

我们怎么将其放回画面呢?

获取不透明阶段的场景深度(Scene Depth) GBuffer

与透明物体的深度相减,得到遮罩

用计算得到的遮罩,剔除被遮挡的部分的颜色

然后水灵灵的将其混合到画面,这样我们就完成了渲染

禁用深度测试

这一步,用两个深度生成模板来扣除遮挡部分的计算,叫做深度测试

默认情况下,透明材质会执行深度测试来剔除被遮挡部分:

可以勾选 Allow Custom Depth Writes 来禁用深度测试,跳过遮挡判断:

没有计算遮蔽这一步,透明物体会无视场景深度,看起来始终在最前方


结语

好了,至此我们已经对透明材质的概念有了一个初步的认知。

接下来,我们将通过一系列实际案例与创意玩法,逐步攻克各种有关透明的需求,在实践中进一步理解和掌握它。

这将涉及图形学、光学、甚至摄影学的,在这个过程中,你会看到不同领域的知识如何交织在一起。

相关推荐
Mr YiRan5 小时前
多线程性能优化基础
android·java·开发语言·性能优化
熊猫钓鱼>_>5 小时前
Java String 性能优化与内存管理:现代开发实战指南
java·开发语言·性能优化
Go高并发架构_王工10 小时前
MySQL性能优化案例分析:从问题到解决方案
数据库·mysql·性能优化
LabVIEW开发18 小时前
LabVIEW 高速采集系统性能优化
性能优化·labview
霍格沃兹软件测试开发1 天前
深入剖析:Playwright MCP Server 的工作机制与性能优化策略
性能优化
武子康1 天前
Java-151 深入浅出 MongoDB 索引详解 性能优化:慢查询分析 索引调优 快速定位并解决慢查询
java·开发语言·数据库·sql·mongodb·性能优化·nosql
fruge1 天前
前端性能优化实践指南:从理论到落地
前端·性能优化
DemonAvenger2 天前
深入浅出Redis List:从基础到实战,10年经验的后端工程师带你解锁最佳实践
数据库·redis·性能优化
InCerry2 天前
为 .NET 10 GC(DATAS)做准备
性能优化·c#·.net·gc