1. 项目概述从“塑料感”到“真实感”的材质跃迁在虚幻引擎5UE5里做玻璃材质这事儿听起来简单调个透明度、给点高光不就行了但很多朋友调出来的玻璃要么像一块廉价的塑料片要么像一块浑浊的果冻怎么都找不到那种通透、锐利又带着微妙光影变化的“玻璃感”。我自己在项目里也踩过不少坑直到把菲涅尔Fresnel节点吃透才算是真正摸到了物理真实渲染的门槛。今天要聊的就是如何告别参数乱调用Fresnel节点为核心配合UE5的材质系统打造出能经得起特写镜头考验的真实玻璃材质。这不仅仅是调几个滑块而是理解光线如何与表面交互并将这种理解转化为材质蓝图中的连线逻辑。为什么Fresnel如此关键简单来说它模拟了一个我们肉眼习以为常但容易被忽略的物理现象观察角度不同物体表面的反射率也不同。你正对着看一块玻璃窗它几乎是完全透明的但当你几乎平行地、从侧面瞥过去玻璃的反射会变得非常强烈几乎像一面镜子。这个“边缘反射强正面反射弱”的现象就是菲涅尔效应。在CG渲染中忽略它材质就失去了立体感和与环境的互动感显得虚假。掌握它你就能让玻璃、水面、丝绸等材质瞬间“活”起来。本文将手把手拆解基于Fresnel构建玻璃材质核心网络的思路并提供一个可直接复用的、参数化的材质实例Material Instance让你能快速适配各种玻璃类型从窗玻璃到水晶杯。2. 核心原理与材质网络设计思路2.1 理解真实玻璃的视觉构成在动手连线之前我们必须先拆解一下当我们看到一块真实的玻璃时我们到底看到了什么。这绝不仅仅是“透明”那么简单。第一层是反射它让玻璃映照出周围的环境尤其是在视线与表面夹角较小的区域。第二层是折射光线穿过玻璃时发生弯曲导致背后的物体产生位移和扭曲这是玻璃“厚度感”和“透镜效应”的来源。第三层是透射即光线直接穿过玻璃的能量它决定了玻璃的整体明暗和颜色倾向。第四层是高光即光源在玻璃表面形成的亮斑其形状和强度反映了表面的光滑度。一个真实的玻璃材质是这四层视觉信息以符合物理规律的方式叠加混合的结果。而Fresnel节点正是控制这多层信息如何根据观察角度进行混合的“总调度师”。在UE5的材质系统中Fresnel节点输出的是一个标量值0到1之间它表征了在当前像素点观察方向与表面法线夹角下的反射强度系数。简单理解输出值越接近1表示该处越应该表现出反射特性更像镜子输出值越接近0表示该处越应该表现出折射/透射特性更像透明体。我们将利用这个值作为Lerp线性插值节点的Alpha通道来动态地混合反射、折射等效果。2.2 材质网络框架设计基于以上理解我们可以规划出核心材质网络的主体框架。这个框架不追求一次性实现所有复杂特性而是抓住主干确保物理正确性和高度的可调性。我们的核心管线将围绕以下几个部分构建菲涅尔控制层计算基础菲涅尔系数并为其添加可调节的“指数”Exponent控制以调整反射从中心到边缘的过渡柔和度。反射层使用场景纹理Scene Texture捕获屏幕空间的环境反射或连接立方体贴图Cubemap作为反射源。其强度将由处理后的菲涅尔系数主导控制。折射层这是玻璃材质的精髓。我们将使用“场景深度”Scene Depth和“像素法线”Pixel Normal来模拟光线弯曲。核心是利用“折射”材质节点并巧妙结合“场景颜色”Scene Color偏移来模拟扭曲效果。透射与着色层决定玻璃的本体颜色和透明度。这里需要处理透明物体的排序问题并允许通过参数控制颜色和透光度。高光与粗糙度层即使玻璃是光滑的微观上也有起伏这决定了高光点的形态和反射的模糊程度。我们将粗糙度作为一个可调参数同时影响反射和折射的清晰度。整个网络的最终输出将是反射颜色、折射颜色、透射颜色根据菲涅尔系数和粗糙度进行多层混合的结果。设计时每一个功能模块都应预留为材质实例参数以便后续无需修改母材质即可进行艺术调整。3. 核心节点解析与实操构建3.1 菲涅尔节点的深度配置在材质图表中搜索添加“Fresnel”节点。默认情况下它连接的是表面法线Normal和相机向量。我们需要重点关注它的两个输入引脚“ExponentIn”和“BaseReflectFractionIn”。Exponent指数这是控制菲涅尔效应过渡曲线的核心参数。默认值通常是3-5。值越小反射过渡越平缓即使正面也会有一定反射适合湿润表面或某些塑料。值越大过渡越尖锐反射会更集中在边缘适合干燥、光滑的表面如纯净玻璃。我通常为玻璃材质创建一个标量参数命名为“Fresnel_Exponent”默认值设为5并将其连接到ExponentIn引脚允许在实例中从3重污渍玻璃到8非常锐利的光学玻璃之间调整。Base Reflect Fraction基础反射率这个参数定义了在正对表面法线与视线平行时的最小反射率。对于绝缘体如玻璃这个值很小约0.02-0.05。我们可以将其固定为一个很小的常量如0.04也可以暴露为参数进行微调。对于追求物理精确的场合可以查阅“折射率”IOR对照表IOR为1.5的玻璃其基础反射率F0约为0.04。一个进阶技巧是对菲涅尔输出进行重映射Remap。默认的0-1输出范围有时不符合美术需求。我们可以使用“乘加”节点或一个简单的线性插值来调整。例如Reflection_Strength Fresnel_Output * 0.8 0.2这能确保反射强度有一个0.2的基底避免完全无反射的区域看起来过于“死”。这个乘数和加数都可以做成参数。注意菲涅尔计算依赖于准确的法线信息。如果你的玻璃模型法线有问题或者你想模拟磨砂玻璃等表面不平整的效果需要将处理后的法线例如通过噪声图扰动后的法线输入到Fresnel节点的Normal引脚而不是直接使用默认的顶点法线。3.2 折射效果的实现与优化折射是玻璃材质的灵魂也是最吃性能、最容易出问题的一环。UE5提供了“Refraction”材质模型但为了更精细的控制我们常采用基于屏幕空间的方法。基础折射实现添加“Scene Color”节点获取当前帧缓冲区的颜色。添加“Refraction”节点。其“Refraction Depth”输入需要连接一个代表折射强度的值。我们可以创建一个标量参数“Refraction_Strength”例如默认值0.1。关键步骤我们需要计算一个偏移向量。添加“Pixel Normal WS”节点获取世界空间法线将其与“Refraction_Strength”相乘。但直接使用会导致折射方向错误。更准确的做法是将法线转换到摄像机空间或者使用“Transform Vector”节点选择从世界空间到切线空间取决于你的需求。一个更直观且可控的方法是直接使用“Refraction”节点输出的偏移值它是一个二维向量UV偏移。将“Refraction”节点的输出偏移输入到“Scene Color”节点的UVs引脚。这样采样场景颜色时就会根据法线和强度进行偏移模拟光线弯曲。深度感知折射避免穿帮上述简单方法在玻璃物体靠近背景物体时效果尚可但当玻璃背后是空白区域如天空或距离很远时偏移采样会错误地采集到玻璃本身前面的物体造成视觉错误。解决方案是结合“Scene Depth”节点。获取当前像素的“Scene Depth”。同样使用折射偏移向量去偏移采样另一个点的“Scene Depth”。比较两个深度值。如果当前像素深度小于偏移采样点的深度说明玻璃在背景前面则使用折射偏移否则减少或取消偏移。这需要通过一个深度比较和条件判断节点来实现逻辑稍复杂但能极大提升折射的真实性特别是在复杂场景中。折射与模糊真实的玻璃折射并非完全清晰尤其是当表面有污渍或不是光学级纯净时。我们可以将折射强度参数与粗糙度关联。更高的粗糙度值可以驱动一个后处理模糊例如通过自定义HLSL或额外的渲染通道或者在采样Scene Color时进行多次抖动采样性能开销大。一个折中的美术方案是在材质实例中调低折射强度同时增加一点点粗糙度让反射层承担更多的视觉信息也能获得不错的效果。3.3 反射层的构建与融合反射层为玻璃提供了环境响应是“高级感”的关键。反射源选择对于实时性要求高的场景使用“Scene Texture”节点并选择“Reflection Vector”或直接使用“Reflection”捕获是最佳选择。如果你的场景中有精心布置的反射探针Reflection Probe效果会非常出色。对于静态或远观物体连接一个高质量的天空球立方体贴图Cubemap也是一个高效的选择。菲涅尔控制将经过处理的菲涅尔系数见3.1节作为反射强度的主要乘数。这意味着反射在边缘强正面弱。粗糙度影响反射不应该是完美的镜面。添加一个“Cubemap”或“Scene Texture”采样后通过“粗糙度”参数来控制其模糊度。在PBR流程中粗糙度会驱动反射的环境贴图Mipmap等级越粗糙采样的Mip等级越高图像越模糊。我们可以直接使用材质自带的“粗糙度”输入或者用一个单独的参数来控制反射模糊。颜色叠加纯玻璃的反射是无色的但我们可以允许美术通过一个颜色参数对反射进行染色以模拟有色玻璃或在特定环境光下的效果。最终反射层的输出颜色需要与折射/透射层的颜色进行混合。这里使用“Lerp”线性插值节点是标准操作。将折射颜色作为A反射颜色作为B菲涅尔系数作为Alpha。这样菲涅尔系数高的地方边缘显示更多反射色低的地方正面显示更多折射色。4. 完整材质蓝图与实例参数详解4.1 材质属性主节点配置首先在材质根节点即材质属性汇总节点上进行关键设置这决定了材质的渲染管线。混合模式Blend Mode必须设置为“半透明Translucent”。这是玻璃材质能够呈现透明效果的基础。着色模型Shading Model选择“清漆Clear Coat”或“默认光照Default Lit”。对于单层玻璃“默认光照”通常足够。但如果想模拟汽车玻璃一层透明基材一层高反射清漆层或更复杂的多层结构“清漆”模型更合适它允许你单独控制一个高光反射层。光照模式Lighting Mode对于半透明物体务必设置为“表面半透体积Surface TranslucencyVolume”。这是UE5中用于正确计算半透明物体光照包括动态光影的模式比旧的“体积方向光照Volumetric Directional Light”或“表面光照Surface”模式效果更好尤其是对于阴影的透射。折射Refraction勾选“折射Refraction”选项并将“折射深度偏差Refraction Depth Bias”调整到一个较小的值如0.1。这有助于缓解折射引起的深度冲突瑕疵。4.2 核心网络连接步骤下面将关键步骤串联起来形成可操作的蓝图法线输入使用“Texture Sample”节点读取一张法线贴图连接到材质根节点的“Normal”引脚。即使是一张微弱的法线贴图也能打破表面的完美平整让高光和反射更有细节。如果没有可直接使用“VertexNormalWS”节点。菲涅尔计算如3.1节所述创建“Fresnel”节点连接处理后的法线并连接“Fresnel_Exponent”和“Fresnel_Base_Reflect”参数。折射路径创建参数“Refraction_Strength”标量默认0.05。添加“Refraction”节点其“Refraction Depth”引脚连接“Refraction_Strength”。添加“Scene Color”节点将其UVs输入连接到“Refraction”节点的输出偏移上。可选创建参数“Glass_Tint”颜色默认白色与“Scene Color”输出相乘得到基础折射颜色。反射路径添加“Scene Texture”节点选择“Reflection”作为纹理ID。创建参数“Reflection_Tint”颜色默认白色和“Reflection_Roughness”标量默认0.1。将“Reflection_Roughness”连接到“Scene Texture”节点的“粗糙度”相关输入如果支持或通过其他方式影响采样模糊度。将“Scene Texture”输出与“Reflection_Tint”相乘再乘以处理后的菲涅尔系数得到最终的反射颜色。混合与输出使用“Lerp”节点A引脚连接折射颜色B引脚连接反射颜色Alpha引脚连接处理后的菲涅尔系数。输出为初步混合颜色。创建参数“Opacity”标量默认0.2和“Transmission Color”颜色默认浅灰色。将“Transmission Color”与“Opacity”相乘作为材质根节点“Opacity”引脚的输入。注意对于半透明物体直接控制“Opacity”不如控制“Transmission Color”的亮度来得直观后者能更好地模拟光能通过率。将上一步“Lerp”输出的颜色连接到材质根节点的“Base Color”和“Emissive Color”引脚为了获得更亮、更不受场景光照压制的效果特别是对于玻璃这种高光材质适当自发光是有益的。将“Reflection_Roughness”或一个独立的“General_Roughness”参数连接到根节点的“Roughness”引脚。4.3 材质实例参数清单与建议值将上述所有标量和向量参数都提升为材质实例参数。以下是一个推荐的可调参数清单及其典型值范围参数名类型描述建议默认值调整范围与效果Fresnel_Exponent标量菲涅尔边缘过渡锐度5.03.0柔和污渍玻璃 - 8.0锐利光学玻璃Fresnel_Bias标量菲涅尔强度偏移0.0-0.1 - 0.2微调整体反射水平Refraction_Strength标量折射扭曲强度0.050.01轻微 - 0.15强烈如厚透镜Glass_Tint向量RGB玻璃本体颜色(1,1,1)白色为无色可调为浅绿、浅蓝等Opacity标量透明度/透光率0.20.1非常透 - 0.5较浑浊Transmission_Color向量RGB透射光颜色与强度(0.8,0.8,0.8)亮度控制透光量颜色影响色调Reflection_Tint向量RGB反射颜色染色(1,1,1)通常为白色可模拟环境光色General_Roughness标量整体表面粗糙度0.050.01镜面 - 0.3磨砂Normal_Strength标量法线贴图强度1.00.0无 - 2.0强烈创建材质实例后通过调整这些参数你可以快速得到不同类型的玻璃将Roughness调高、Fresnel_Exponent调低、Glass_Tint调为深绿色即可得到旧仓库的磨砂绿玻璃将Refraction_Strength调高、Opacity调低、Roughness调到接近0即可得到晶莹剔透的水晶或镜头玻璃。5. 性能优化与常见问题排查5.1 性能开销管控要点半透明和折射是渲染性能的“杀手”。在项目中大量使用复杂玻璃材质时必须进行优化。层级简化对于中远景的玻璃物体使用简化版本的材质。可以禁用折射Refraction_Strength设为0仅保留菲涅尔控制的简单反射和颜色透射。这能节省大量的屏幕空间纹理采样开销。LOD材质为玻璃材质创建Level of Detail细节层次材质实例。在模型的LOD设置中随着距离增加切换到更简单的材质实例。控制折射采样折射依赖的“Scene Color”采样开销很大。确保玻璃材质只在必要时使用高质量折射。对于平板玻璃如窗户有时用视差偏移或简单的纹理扰动模拟折射足矣性能更好。半透明排序问题多个半透明物体重叠时渲染顺序可能导致错误。尽量确保玻璃模型的网格是封闭的有厚度而非单面片。在材质中适当调整“半透明优先级Translucency Priority”可以手动控制渲染顺序但这是最后的手段应优先从模型和场景布局上解决。5.2 常见视觉问题与修复方案即使网络连接正确在实际应用中仍会遇到各种视觉瑕疵。以下是一些典型问题及排查思路问题现象可能原因排查与修复方案玻璃边缘出现黑色或奇怪色块1. 折射采样到了场景深度缓冲区之外如天空盒。2. 法线信息错误导致菲涅尔计算异常。1. 实施“深度感知折射”逻辑见3.2节或降低Refraction_Strength。2. 检查模型法线是否统一朝外检查法线贴图是否应用正确。在材质中预览“World Normal”输出。玻璃看起来像不透明的灰色塑料1. 菲涅尔效应太弱或没有生效。2. 透射Transmission值太低或颜色太暗。3. 环境光照不足。1. 检查Fresnel节点是否正确连接增大Fresnel_Exponent确保法线输入正确。2. 提高Transmission_Color的亮度V值确保Opacity值不是1。3. 在场景中放置足够的动态或静态光源确保有光可以穿过玻璃。折射效果扭曲方向错误或过于夸张1. 折射强度参数值过大。2. 用于计算偏移的法线方向错误。1. 将Refraction_Strength降至0.01-0.05范围再试。2. 尝试对“Pixel Normal WS”取反乘以-1或者检查模型导入时是否勾选了“反转法线”。玻璃内部有奇怪的条纹或噪点1. 屏幕空间反射SSR或折射的典型噪点。2. 材质着色器编译精度问题。1. 在项目设置中提高后处理质量特别是SSR的采样数。对于最终发布版本可以考虑使用光线追踪反射/折射如果硬件支持。2. 尝试在材质根节点将“着色器精度Shader Precision”从“半精度Half”改为“全精度Full”。注意这会增加显存和性能开销。多个玻璃重叠时后面玻璃不显示或显示错误半透明物体渲染排序问题。1. 首先确保所有玻璃模型不是单面检查“双面Two Sided”属性。2. 尝试调整模型在场景中的前后位置。3. 作为最后手段为不同的玻璃材质实例设置不同的“半透明优先级Translucency Priority”数值数值高的后渲染。5.3 进阶技巧添加表面瑕疵与尘埃绝对干净的玻璃只存在于实验室。为了增加真实感我们可以引入表面瑕疵。尘埃与指纹使用一张灰度贴图作为蒙版混合一个微弱的、粗糙度更高的材质层。将这张贴图采样用其Alpha通道去Lerp基础粗糙度和一个更高的粗糙度值。同时也可以用这张贴图轻微扰动法线。边缘污渍玻璃边缘特别是长期放置的玻璃容易积累灰尘。我们可以利用顶点颜色Vertex Color或基于物体空间位置生成的渐变来驱动边缘区域的粗糙度增加和透光度降低。内部气泡与杂质对于艺术玻璃可以在折射路径中用一张3D纹理Volume Texture或程序化噪声来轻微扰动折射方向模拟内部的不均匀性。但这属于比较高级的效果性能开销需谨慎评估。调试这些效果时一个核心心法是每次只添加一层变化并观察其影响。将所有参数都暴露给材质实例在引擎中实时滑动滑块观察变化是理解每个节点作用的最快途径。不要害怕尝试极端的参数值它能帮你快速找到问题的边界和参数的敏感区间。最终一个优秀的玻璃材质是物理正确性与艺术表现力之间精心平衡的产物。