ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Substrate 材质学习记录

Substrate 材质学习记录 BSDF包括了BRDF 和 BTDF简而言之BRDF是反射BTDF是投射透射的本质是光穿过不同的介质在引擎里面经常看到BXDF其实BXDF里的x是占位符这里的x可以替换成RReflectance TTransmittance SScattering光射到物体表面都会有三层1. Specular / F0 表面镜面反射也就是光刚碰到表面时有多少被直接反射回来。 2. BaseColor / Albedo 非金属时进入表层后的光被吸收一部分再以漫反射形式出来的颜色。 金属时BaseColor 更多影响镜面反射颜色。 3. Transmission / Subsurface / Mean Free Path 光真的进入介质内部走了一段距离被吸收、散射、透射出来。自由程更准确叫Mean Free Path 平均自由程它描述的是光在介质内部平均走多远会发生一次散射/吸收学习substrate前我们先了解一下substrate里面的术语这几个是 Substrate 的骨架。概念重要程度为什么要先懂BSDF必须Substrate 的材质本质就是一堆 BSDF。closure必须一个可被材质树管理的 BSDF 单元。你要知道 ClosureCount 数的是它。lobe必须一个 closure 内部的具体光照分量比如 diffuse/specular/fuzz。material tree必须多个 BSDF 怎么 mix / over / layer靠树结构表达。feature mask必须材质用了哪些特殊能力比如 SSS、Fuzz、Anisotropy、Toon。simplification必须Substrate 很复杂很多路径会强制简化。这个不懂调 Lumen/RT 会懵。fully-simplified projection必须Lumen card、RT、MaterialCache 等经常不吃完整材质而吃简化投影。substrate里面的closure是什么先举最简单例子普通塑料球一个普通红色塑料球红色塑料它虽然里面有很多参数颜色 粗糙度 金属度 高光 法线但它整体就是一种材质。所以可以理解成Closure 0 红色塑料也就是ClosureCount 1不是因为它只有一个参数而是因为它只有一个“材质单元”。问那我以车漆举例子散粉车漆还有保护层三层就是三个closure然后closurecount 3答对可以先这么理解散粉层 车漆层 保护层 ≈ 3 个材质层 ≈ 3 个 closure ≈ ClosureCount 3这个理解方向是对的。不过要补一个小心点在 UE Substrate 真实编译/运行里不一定永远严格等于 3。因为引擎可能会做合并、简化、裁剪、质量降级。但概念上你这样理解完全没问题。什么是lobe那lobe就是一个 closure 里面的某一种反光/散射分量。更白话closure 是一个完整材质包 lobe 是这个材质包里的一个光照效果分支。你有一个车漆 closureClosure红色车漆这个红色车漆受到光照后不只产生一种效果。它可能同时有1. 红色漫反射 2. 镜面高光 3. 金属颗粒高光这些不同的“光照分量”就可以理解成不同 lobe。比如Closure红色车漆 ├─ Lobe 0Diffuse 漫反射 ├─ Lobe 1Specular 镜面反射 └─ Lobe 2Metal flakes 金属颗粒反射什么是material tree?你有三层散粉 保护层 车漆如果只是单独列出来还不够。Substrate 还需要知道它们的关系散粉 是覆盖在保护层上 保护层 是覆盖在车漆上 散粉和保护层是混合 还是按 mask 混合所以它会形成一棵树。比如Over / \ 散粉 Over / \ 保护层 车漆这就是 material tree。意思是散粉 over 保护层 over 车漆什么是feature mask节点面板上“有这个输入口” 不等于 feature mask 一定打开。feature mask 更关心这个材质最终是否真的用了这个 feature。什么是simplificationsimplification就是把复杂 Substrate 材质压成一个更简单、便宜、兼容性更好的近似材质。换句话说完整材质太贵/太复杂/某些渲染路径吃不下 引擎就把它“折叠”成一个简化版本来用。先用你的车漆例子完整车漆可能是散粉层 over 透明保护层 over 红色车漆层 金属颗粒 Fuzz Anisotropy这可能有多个 closure 多个 lobe 复杂 material tree 特殊 feature在主视角 raster direct lighting 里也许还能认真算。但到了某些路径比如Lumen Card Capture Ray Tracing Material Cache 某些 Path Tracing 辅助路径 远处 HLOD它可能不想/不能完整处理这么复杂。于是就 simplification复杂车漆 ↓ 简化成一个普通近似材质比如BaseColor ≈ 混合后的红色 Roughness ≈ 一个平均粗糙度 F0 ≈ 一个近似反射率 Normal ≈ 主法线 Emissive ≈ 近似发光原来多层结构可能被压成一个 Slab BSDF一个 Slab BSDF 通常就是一个 closure。什么是fully-simplified projection?fully-simplified projection可以理解成把一个复杂 Substrate 材质投影/压缩成一份最简单、最通用、所有路径都能读懂的材质结果。如果simplification是“简化”那fully-simplified projection就是简化到最彻底的版本。先用车漆例子你的完整车漆散粉层 over 保护清漆层 over 红色车漆层 金属颗粒 Fuzz Anisotropy完整 Substrate 里可能有多个 closure 多个 lobe 复杂 material tree 特殊 feature mask但是某些路径比如Lumen Card Material Cache 部分 Ray Tracing 部分 Path Tracing 辅助路径 GPU Lightmass 旧 GBuffer fallback可能不想处理这么复杂。于是它需要一份“最低保真但稳定通用”的版本一个近似 BaseColor 一个近似 Roughness 一个近似 F0 / Specular 一个近似 Normal 一个近似 Emissive这就是 fully-simplified projection。顺序1、先想光打到物体表面 反射多少反射率又是多少然后填写F0其中F就是fresnel的意思2、思考光打到物体表面后会不会射入物体如果不射物体Diffuse Albedo和SSS MFP就不用考虑了3、如果会打入物体内部思考光打入物体内部的固有色是什么颜色Diffuse Albedo4、然后再考虑光线能在物体能不射多深设置SSS MFP入射光 ↓ ┌──────────────────── 表面薄薄一层 ────────────────────┐ │ │ │ 一部分光直接弹走 → Specular 高光 → F0 控制颜色/强度 │ │ │ └───────────────────────────────────────────────────────┘ ↓ 剩下的光进入里面 ↓ ┌──────────────────── 材质内部 / 底层 ──────────────────┐ │ │ │ 光被吸收、散射再出来 → Diffuse → DiffuseAlbedo 控制颜色 │ │ │ └───────────────────────────────────────────────────────┘拿红色塑料举例红色塑料 F0: 很低偏灰白 只影响高光 Diffuse Albedo: 红色 决定物体大面积主体颜色 最终看起来 红色身体 灰白/白色高光画成这样白色小高光 ↓ ┌────────────────┐ │ ◯ │ ← F0 负责这个高光颜色 │ │ │ 红红红红红 │ ← DiffuseAlbedo 负责大面积红色 │ 红红红红红 │ └────────────────┘材质里的SSS通常代表Subsurface Scattering中文叫次表面散射。意思是光线不是只在物体表面反射而是会进入材质内部经过散射后再从附近透出来。入射光首先根据菲涅耳效应在表面产生镜面反射其中正视角下的基础反射率由F0决定未被表面反射的光进入材质内部并在吸收与散射作用下传播其传播深度和扩散范围由mfp等参数控制。经过多次散射后部分光从入射点附近重新出射形成 SSS 效果其最终颜色和强度受到DA漫反射颜色、次表面颜色以及吸收参数的共同影响。“进入皮肤内部并在内部改变方向”叫散射“经过散射后又从皮肤表面附近出来”叫次表面散射SSS的完整结果。参考视频讲的很清晰https://www.bilibili.com/video/BV1bx411s775/?spm_id_from333.337.search-card.all.click概念含义视觉结果透射 Transmittance光从材质一侧进入穿过材质后还有多少能出来透明、半透明、带颜色的透光散射 Scattering / SSS光进入材质后在内部被多次改变方向发软、发雾、边缘透光、皮肤/蜡/玉/牛奶感MFP是光在材质内部两次散射之间的平均传播距离不是一个固定的几何深度。但不要把它理解成“光固定进入 2 cm 深度后才出来”。它是一个平均传播距离实际路径会因为多次散射而改变。各向异性可以概括为材质的光照、反射或散射效果会随着方向不同而不同。表面各向异性 → 表面反射的高光沿发丝方向拉长 → 主要形成头发上的细长亮带 SSS 内部散射各向异性 → 光进入发丝内部后散射更偏向某个方向 → 影响内部光的传播和重新出射对应你 UE 的节点参数Anisotropy主要控制表面高光的方向性SSS Phase Anisotropy控制 SSS 内部散射的方向性。单根发丝沿长度方向法线变化很小 入射光 ↘ ↘ ↘ ↘ ↓n ↓n ↓n ↓n 反射到摄像机 ═══════════════════════ ↗ ↗ ↗ ↗ ──────── 细长高光 ─────── ←── 发丝长度方向 ──→ 沿发丝长度方向表面法线变化很小 相同的反射条件会重复出现 所以高光会连成一条长亮带。各向异性正值沿Tangent拉长高光负值沿Tangent的垂直方向拉长左边微小镜面朝向杂乱 → 反射方向分散 → 形成圆形高光右边微小镜面结构沿发丝方向排列 → 反射光方向更集中、更有方向性 → 高光沿发丝方向拉长最重要的一句话是各向异性不是让光沿着发丝跑而是让发丝表面的许多微小镜面把光反射成沿发丝方向排列的亮带。Substrate 材质中 Diffuse Albedo、F0 与光源颜色之间的物理耦合关系当材质主要反射绿色漫反射和蓝色镜面光而场景只提供红色入射光时材质表面会因缺少可反射能量而显著变暗从而体现 Substrate 对界面反射、介质散射和能量守恒的表达能力。在UE5.8的新shadingmodels下面有多出来两个新的shadingmodel:TranslucentGreyTransmittanceSubstrate 下的普通半透明透过率是灰度/单通道普通透明玻璃、薄雾、简单半透明TranslucentColoredTransmittanceSubstrate 彩色透射半透明类似旧 ThinTranslucent彩色薄玻璃、有色透明材质Sub-Surface Type 下拉枚举它做什么光的“方向感”适合什么None不启用次表面散射没有皮下透光/扩散金属、普通不透明材质Wrap用很便宜的方式模拟皮肤/蜡质的“绕光”光会从亮面稍微包到暗面柔化明暗交界二次元皮肤、卡通柔边、低成本 SSSTwo-Sided WrapWrap 的双面版本背面的光也能影响正面像薄片被光穿过树叶、耳朵、薄布、纸片Diffusion更真实的皮下扩散光进入表面后在皮下横向扩散再从附近出来皮肤、蜡、玉、需要柔和肉感的材质Diffusion Profile用 Subsurface Profile 资产控制扩散和 Diffusion 类似但扩散颜色/半径由 Profile 控制UE 传统皮肤 SSS 工作流Simple Volume简单体积透光光沿厚度/视线穿过材质像薄玻璃或透明体薄玻璃、半透明体、带颜色透射的材质UE5 Path Tracing 本质上是从玩家屏幕/摄像机视角往场景里发出很多条随机光路模拟它们在场景里反射、折射、散射、吸收最后把大量样本平均成一张图。一条路径大概这样相机 ↓ 打到模型表面 ↓ 根据材质 BSDF 决定反射折射进入内部漫反射 ↓ 继续打到下一个表面 ↓ 再根据那个材质继续弹射 ↓ 最后命中光源 / 天空 / 环境光 ↓ 得到这个像素的一次采样颜色实时渲染里的Temporal通常是上一帧 当前帧 → 做抗锯齿、降噪、稳定画面 → 目标是实时显示Path Tracing / Movie Render Queue 里的Temporal Samples更像是在一个快门时间内采样多个时间点 → 用来得到更准确的运动模糊、景深、动画中的采样 → 每个时间点也会做 Path Tracing 采样也就是说Spatial Samples 同一帧、同一时间点对像素多采几次。 Temporal Samples 同一帧的快门时间内取多个时间点采样。最终样本数大概是总样本数 Spatial Samples × Temporal Samples一帧画面并不一定代表“某一个瞬间”它可以代表“一小段时间内看到的平均结果”。这就是相机里的“快门时间”。比如一秒 24 帧第 10 帧 不是只能表示 0.416666 秒这个瞬间 它也可以表示 0.416 秒 ~ 0.458 秒 这段时间里相机接收到的平均光这一帧不是只算一个时间点 而是在快门时间内取 8 个时间点 t1算一次 t2算一次 t3算一次 ... t8算一次 最后平均成这一帧Path Tracing 的关键恰恰是从相机出来的路径大多数时候是在随机试探最后不一定能命中光源。一条路径大概是相机射线 ↓ 打到表面 ↓ 根据材质随机选一个下一跳方向 ↓ 再打到别的表面 ↓ 继续随机弹 ↓ 可能命中光源也可能一直没找到光源如果最后命中光源这条样本有贡献如果没有命中光源这条样本贡献很小甚至是黑的然后它靠大量采样平均有些路径找到光 有些路径没找到光 平均之后 这个像素实际接收到的光照概率但 UE / 现代 Path Tracer 不会只靠“瞎弹到光源”。因为那样很慢尤其是小灯。通常会做一件事每次打到一个表面时 额外朝光源方向发一条“阴影/可见性测试射线”也就是相机 → 表面点 ↓ 直接连到光源检查一下如果中间没被挡住就把这个光源的直接照明算进去。所以更准确的结构是相机射线打到表面后会做两件事 1. 直接光采样 → 主动问这个点能不能看到某个光源 2. 间接光路径继续弹射 → 随机选方向继续找下一次反射/折射/散射因此不是一开始就知道“这条线会射回光源”。而是先从相机找到可见点再在每个可见点上一边主动采样光源一边继续随机追踪间接光。金属度转 Diffuse Albedo / F0传统 UE 材质里常用Base Color Metallic Specular Roughness但 Substrate 更偏物理拆分Diffuse Albedo介质/漫反射颜色 F0正面视角的基础镜面反射 F90掠射角的镜面反射颜色所以Substrate Metalness-To-DiffuseAlbedo-F0节点的作用就是把旧 PBR 的 BaseColor / Specular / Metallic 转换成 Substrate 需要的 Diffuse Albedo / F0核心理解非金属 Metallic 0 BaseColor 主要进入 Diffuse Albedo F0 保持较低通常是塑料/皮肤/石头那种小高光 金属 Metallic 1 Diffuse Albedo 基本没了 BaseColor 更多变成有颜色的 F0 因为金属主要靠表面镜面反射显色二次粗糙是什么讲的是Second Roughness和Substrate Haziness-To-Secondary-Roughness。你可以把普通粗糙度想成一个高光波瓣二次粗糙就是再加一个高光波瓣也就是一个材质可以同时有主高光比较清晰、比较集中 次高光更宽、更散、更像雾感/浑浊感所以它不是 SSS也不是 MFP。它仍然主要是表面镜面反射的形状变化。直观效果只有 Roughness 一个高光干净直接 Roughness Second Roughness 一个亮核心 一圈更软的泛光/浑浊高光Haziness-To-Secondary-Roughness就是把“浑浊感”转成合理的二次粗糙度。官方也把它列为 Substrate Helper Node用来根据基础粗糙度和 haziness 计算第二个高光波瓣粗糙度。油膜专项是在用“油膜”这个例子讲 Substrate 辅助节点的用途。油膜不要理解成普通颜色贴图。它更像表面覆盖了一层极薄透明膜 光在薄膜上表面和下表面发生反射 不同波长互相增强/抵消 于是产生彩色高光所以油膜颜色主要来自镜面反射 / 视角变化 / 薄膜干涉不是来自Diffuse Albedo 漫反射颜色这点很关键。油膜、肥皂泡、金属氧化膜那种彩虹色本质上更接近薄膜高光颜色变化不是“材质内部散射出来的颜色”。Thin-Film、F0、F90、Normal、IORSubstrate Thin-Film节点。官方 API 里这个节点的输入包括F0 F90 IOR Normal Thickness它的作用是根据薄膜参数重新计算材质的镜面 F0 / F90 表现各参数可以这样理解F0 正面看材质时的基础高光反射。 F90 侧面、掠射角看材质时的高光颜色。 IOR 薄膜折射率影响光进入薄膜后的弯折和反射比例。 Normal 决定局部表面朝向。法线变了入射角也变薄膜颜色也会变。 Thickness 薄膜厚度。厚度变化会导致不同颜色被增强/抵消所以会出现彩虹油膜感。Blend Mode 混合模式选项含义常见用途Opaque完全不透明不透光角色身体、衣服、武器、石头、金属、绝大多数材质Masked二值裁剪要么显示要么不显示树叶、头发卡片、破洞布料、铁丝网TranslucentGreyTransmittance半透明但透射颜色被简化成灰度性能更好普通玻璃、水膜、轻透明材质实时更推荐TranslucentColoredTransmittance完整彩色透射光穿过材质会被染色彩色玻璃、液体、宝石、厚水层更贵ColoredTransmittanceOnly只保留透射/吸收效果表面反射交互基本为 0类似滤色片、纯吸收介质、特殊玻璃透色测试Additive材质颜色加到背景上越叠越亮火焰、能量、魔法、粒子、光晕AlphaComposite预乘 Alpha 混合比普通透明更适合烟雾/粒子边缘烟、雾、火焰、半透明 VFXAlphaHoldout用当前材质把后面的透明物体“挖洞”特殊遮罩、UI/VFX 合成很少用于普通材质
返回列表