【UE】材质与半透明 - 00.什么是半透明材质
本系列将聚焦于各种实用的透明效果案例实现,每篇文章篇幅不会很长。
但在讲案例之前,需要先补上一些重要的前置知识——透明材质是什么,UE 中“透明”到底意味着什么。
现实中的透明是什么?
要理解引擎里的透明,我们必须先回到现实世界,看看自然界的光学现象。
如果在 UE 中,你认为这些物体的透明度是多少呢?
在日常生活中,人们会凭直觉将物质分为:不透明
半透明
透明
我们在游戏或渲染材质里也常常设定一个“透明度”参数。但要理解的是,这并不是一个严格的物理量。
在现实中,没有单一的物理量叫做“透明度”。所谓透明现象,是光与物质发生多种复杂相互作用的综合结果——涉及折射、散射、吸收、表面反射、表面粗糙度等多个因素。
现实光学中,更准确描述透光能力的量是透射率(Transmittance),即光线穿过介质后的能量比例。
图示箭头代表光线传播方向。
这是一个高度简化的模型:
- 光线在介质内可能多次散射,不一定只从背面射出
- 介质内部可能发生全反射,增加光程,引发更多吸收
- 吸收距离并非固定,取决于材质的微观结构
这些更复杂的机制,会在讲到 SSS(次表面散射) 时详细展开。
影响透射率的主要因素
-
材料吸收系数
决定光在传播过程中被材料分子吸收的程度。吸收能量会转化为热或其它形式。 -
材料厚度
按 Beer–Lambert 定律 ,厚度越大,透射光强呈指数衰减。 -
散射现象
材料内部的微结构会导致光线路径偏折,减少直射光强。例如玉石、乳白玻璃会发生强烈散射,使透过的影像模糊。 -
表面反射
折射率变化会造成部分光被反射。即使是优质玻璃,单个界面也会反射约 4% 的入射光(无镀膜)。
UE 中的透明是什么?
从“金属值”说起
听起来关乎透明的主题,却为什么会提到“金属值”?
没错,因为透明与金属的光学本质,其实有共通的物理来源。
考虑镀膜玻璃这个例子:
即使是透明的玻璃,表面加上极薄的金属镀膜后,其反射率会大幅提高。
这是因为金属的光学行为是极端的导体案例
材料的复折射率 n+ikn + ikn+ik 中,消光系数 kkk 在可见光范围极大,意味着光进入极浅的深度就几乎被完全衰减。绝大部分入射光直接在表面被反射,少数透过镀膜的光才进入玻璃。
金属的反射机理
根据麦克斯韦方程组,导体的自由电子响应远强于介电体的位移电流。入射光在金属自由电子中激发强烈的感应电流,其电场与入射光存在约 90° 的相位差,导致大部分能量反射。
这导致除了转化为热的部分外,大部分光被反射(这就是金属镜面反射强烈的原因)。
不同金属的吸收系数随波长变化不同,这种选择性吸收与反射造成了颜色差异:
- 金吸收蓝光,反射红黄光 → 呈金色
- 铜反射红橙,吸收蓝 → 呈红铜色
回到镀膜玻璃,即使镀层极薄,仍能部分透光,但反射率显著提升。
透明的真实本质
那么之所以先提到“金属”,就是为了引出他:
一切物体都是“透明”的
所有物体在某种意义上都是“半透明”的。
在真实世界中,物质的光学行为是连续的光谱分布,折射率、消光系数、吸收系数都会随波长平滑变化,不存在“绝对”两极分类。
当我们沿着真实物理继续探究时,会发现:“透明”才是更贴近世界本质的材质模型,反倒是我们习以为常的“不透明”,只是为了实时计算而构建的抽象化近似。
区分是否透明,是技术上的折中
“不透明”是一种典型的技术折中,既规避了多余的渲染开销,又赋予了美术更高的可控性。
这看似“倒反天罡”的结论,就是 Shader,乃至整个图形学的本质:
- 在有限算力下,实现最好的视觉
因此:
- 图形学的艺术就是魔术的艺术
- 看上去是对的就是对的
接下来的文章中,我们要牢牢记住这两条共识。在把玩“透明”的时候,我们非常需要依赖这样的思路。
透明材质
现在我们已经理解,在 UE 的材质系统中,
不同的混合模式(如 Opaque、Translucent、Masked)和着色模型,其实都是为了减少计算量而存在的技术折中。
真实透射率渲染的计算代价
但是这会有一个看似合理的疑问:
既然透射率是自然界的真实物理属性,为什么不让所有物体都按真实透射率渲染?
石头用低透射率,玻璃用高透射率,不就是更接近现实吗?
1.真实透射率渲染的计算代价
在物理正确的透明渲染中,我们至少需要处理:
- 光线的折射与反射分配(菲涅尔方程)
- 在介质内部的多次散射与吸收(Beer–Lambert + 相函数)
- 厚度与体积效应(非平面材质,光程变化)
- 透射后还要继续参与场景光照计算(光线继续传播到其它物体、再反射回来)
这意味着,每一个透明像素都可能:
- 发出多条二次射线(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
②之前。
可以仔细的看看
附加 Additional
中Translucency
的流程,Transparent 渲染基本上会头计算一遍半透明的光照与反射的计算
不过你可能会说,附加 Additional
不是在后处理 PostProcessing
②之前吗?为什么可以视为后处理?
半透明通道
实际上,我们可以在透明材质细节设置中使用半透明通道
通过这个设置,你可以让透明材质与自定义后期(Post Material)在渲染顺序上混合:
将半透明
和Post
完全混在一起,随意的更改透明在后处理阶段中的顺序
用一张示意图来描述的话,①和②都是相机前的一层层面片模型(面积填充相机画面):
①为排序后的半透明,每一层就是 一个 渲染的透明模型
②为Post中的各种特效和自定义特效,泛光,景深,动态模糊等,他们也是有先后顺序的
通过半透明通道
可以调整每个透明材质(自定义后期处理
材质也同样设置),在后期中的先后顺序,最终可以完全混编半透明与Post,因此可以说,半透明就是后期
使用半透明材质制作的后期效果
我们理清了半透明在管线里的地位。
那么回到示例,现在我们对半透明排序,然后由远到近渲染半透明
先渲染最远的
然后由后到前逐个向前渲染,直到完成
我们怎么将其放回画面呢?
获取不透明阶段的场景深度(Scene Depth) GBuffer
与透明物体的深度相减,得到遮罩
用计算得到的遮罩,剔除被遮挡的部分的颜色
然后水灵灵的将其混合到画面,这样我们就完成了渲染
禁用深度测试
这一步,用两个深度生成模板来扣除遮挡部分的计算,叫做深度测试
默认情况下,透明材质会执行深度测试来剔除被遮挡部分:
可以勾选 Allow Custom Depth Writes 来禁用深度测试,跳过遮挡判断:
没有计算遮蔽这一步,透明物体会无视场景深度,看起来始终在最前方
结语
好了,至此我们已经对透明材质的概念有了一个初步的认知。
接下来,我们将通过一系列实际案例与创意玩法,逐步攻克各种有关透明的需求,在实践中进一步理解和掌握它。
这将涉及图形学、光学、甚至摄影学的,在这个过程中,你会看到不同领域的知识如何交织在一起。