由 astra 生成 · 更新于 2026-09-27 18:44(北京时间)
本文在六份独立分析完成后,比较同一问题在三个截帧中如何解决。单游戏公式、分支参数和原始程序由各自文档展开;这里集中解释设计差异、数据依赖和由此产生的约束,不以捕获编号或提交数量作为比较维度。
先读对应游戏的场景和角色,再读本篇;角色之间的横向差异另见 角色实现对比。
| 游戏与截帧 | 单独场景分析 | 单独角色分析 |
|---|---|---|
| 绝区零:蕾米大厅 | 场景实现 | 角色实现 |
| 原神:木偶雪城 | 场景实现 | 角色实现 |
| 终末地:竹林场景 | 场景实现 | 角色实现 |
1. 场景着色在哪里完成
| 要解决的问题 | 绝区零 | 原神 | 终末地 |
|---|---|---|---|
| 表面信息何时变成光照颜色? | 场景材质先写烘焙光照量与表面颜色,脸部可直接写已着色颜色;后续再按类别补光 | 材质先组织颜色、法线和控制量,公共延迟光照按类别消费;专用角色材质保留自己的明暗规则 | 场景先做延迟光照,角色所在的后续几何路径直接补入着色颜色,同时写运动 |
| 静态环境照明如何接入? | 按独立光照 UV 采样压缩烘焙光,解码到 HDR,并用法线方向修正 | 空间查询结构与屏幕反射/间接光结果共同参与;角色另采样场景颜色与阴影并平滑 | 按世界位置查询近、中、远三层体积,再按表面方向重建各颜色通道的一阶光照 |
| 阴影如何避免全部重新生成? | 可见几何与阴影代理分开,局部缓存和逐对象解析接入屏幕阴影 | 把压缩烘焙阴影解压到图集,再与动态几何阴影共同使用 | 阴影图集按区域更新,同时供表面着色与雾体积使用 |
| 反射颜色从哪里来? | 对镜像视点重新渲染场景,另有环境反射探针 | 延迟反射与空间数据链共同生成间接/反射结果;内部追踪规则未完全还原 | 屏幕追踪生成历史颜色采样坐标,从上一帧 HDR 取色并建立过滤层级 |
| 材质如何响应环境变化? | 世界高度、表面朝向与湿润噪声共同改变颜色、法线和表面响应 | 高度层缓存、顶点遮罩和表面方向控制雪覆盖;雪细节还输出时序控制位 | 方向光照体积与积分雾直接进入后续几何着色,保持角色与所在空间的联系 |
| 如何避免历史拖影? | 检查重投影后的像素身份,再按运动量和颜色邻域限制历史 | 先做空间边缘处理,再根据运动、覆盖标记和累积状态重建;材质高位决定部分历史策略 | 先比较前后深度、运动和分类,汇总有效性,再融合 HDR 历史 |
| 哪些数据必须保存到后面? | 像素身份与颜色历史成对保存;离屏反射在主视图消费前有效 | 法线最后一次用于光照后才可改写成运动;角色环境结果先读旧值、后更新 | 旧 HDR 同时供反射和时序读取;光照场、雾体积与 Bloom 各层有不同保留范围 |
绝区零在普通材质阶段已经取得烘焙光,部分角色还直接写专用着色结果,因此后续光照需要识别哪些贡献已经存在。原神先组织公共材质数据,再把空间环境结果、阴影和专用材质控制结合起来;其中有些控制位一直影响到时序。终末地则先完成场景全屏光照,后续几何再直接消费环境输入、补入角色颜色和运动。
差别在于哪一个阶段拥有最终的材质求值权。将它们统一改成“所有物体先写底色,最后一个全屏程序完成照明”,会丢掉绝区零已有光照的语义,以及终末地后续几何的专用计算。
2. 相同格式不代表相同表面数据
| 实际用途 | 绝区零 | 原神 | 终末地 |
|---|---|---|---|
| 表面法线图:保存表面朝向,决定光照与遮蔽 | RGB 直接编码方向,RGB10A2 | 材质阶段 RGB 直接编码方向,RGB10A2;后面复用为运动矢量图 | RG 使用八面体编码,RGB10A2 |
| 材质颜色图:为后续着色提供表面颜色 | RGBA8 sRGB;场景分支保存颜色,部分角色分支改作材质控制数据 | RGBA8 sRGB;含角色已经过材质处理的颜色 | RGBA8 sRGB |
| HDR 光照颜色图:存放已计算的亮度与颜色 | RGBA16F;材质阶段已包含烘焙光/角色着色等结果 | 延迟光照独立生成 HDR 场景颜色 | R11G11B10F;材质结束时近黑,后续逐步加入光照 |
| 运动矢量图:保存前后帧屏幕位移,定位历史像素 | 脸部已在材质扩展图的 RG 写压缩运动;后续另有运动与像素身份图供时序读取 | 光照后把原法线图改写为运动矢量与控制标记,RGB10A2 | RGB10A2;同时包含时序分类,后续几何/效果继续更新 |
| 附加材质参数图:控制表面如何接受后续光照 | RGB10A2在场景分支保存材质量、脸部分支复用为运动/标记;另有颜色图 alpha 控制量 | 第二着色/材质参数图 RGBA8 sRGB,附加材质标量图 R8 | RGB10A2;完整反射/材质参数位域未全部解码 |
| 材质类别/扩展标记图:选择处理分支 | 材质图通道与模板分类共同承载 | 材质类别与时序控制 R8,打包扩展标记 R8 | 主运动图的附加通道与模板分类共同承载 |
| 相机深度与模板图:遮挡测试、空间位置重建与分类 | D32S8 | D32S8 | D32S8 |
三个重要区别直接影响解码和阶段组织:
- 方向编码不同。 绝区零、原神从 RGB 线性映射恢复法线;终末地从 RG 八面体编码恢复三维方向。把它们都当普通 RGB 法线,会使后者的光照和 AO 朝向错误。
- 语义可以由材质类别决定。 绝区零场景在材质扩展图写表面参数,脸部却可在相同通道写运动/标记;HDR 附件里也分别存在烘焙光照量和已经着色的颜色。分类必须参与解读。
- 语义也可以由使用时间决定。 原神先用一张纹理保存法线,公共光照消费完成后再改写成运动图。复用的是存储空间,前后两阶段使用的数学意义不同。
法线与运动数据的实际解码见独立场景分析。下面的配图按可见效果选择:材质到照明、遮蔽区域与时序输入输出分别说明其贡献。
3. 光照跟随表面 UV、空间位置还是环境反馈
| 材质阶段:已有光照 | 材质阶段:表面颜色 | 后续完成后的画面 |
|---|---|---|
![]() |
![]() |
![]() |
观察 HIA 浮雕字、墙板凹处和吧台面。 左图已经具有明暗,但没有完整表面配色;中图保留红黄标牌、木地板与金属面分区;右图将这些数据与后续着色合成。前两图是同阶段的不同输出,说明光照量与表面颜色的分工;右图还包含后续灯光和后处理,不能当作单一效果开关实验。
| 环节 | 绝区零 | 原神 | 终末地 |
|---|---|---|---|
| 已确认的空间/烘焙照明输入 | 独立光照 UV 采样压缩烘焙光、天空遮蔽与环境探针 | 空间查询结构与屏幕输入联合产生间接/反射候选 | 按世界位置查询近、中、远三层光照系数 |
| 方向怎样参与 | 着色法线与几何法线夹角修正烘焙光;动态光另查候选列表 | 公共光照消费法线;空间间接链内部方向模型尚未完全解码 | 各颜色通道按 max(dot(方向系数,方向)+常量项,0) 重建 |
| 角色如何取得环境 | 专用材质同时消费阴影和角色数据 | 采集场景颜色/阴影,按不同规则汇总和平滑,再由角色读取 | 后续几何直接查询同一空间光照场与积分雾 |
绝区零的代表烘焙光使用 0.5×u/(1-u) 恢复 HDR,光照 UV
由实例独立变换;因此这部分照明与资产表面参数化关系紧密。终末地的输入则由世界位置寻址,方向系数再决定表面朝向的受光,近层边界向更粗覆盖平滑过渡。
原神角色传感器是场景与角色之间的反馈接口:采样材质颜色和阴影,不等于已经还原了完整物理入射光场。空间间接链与角色传感器应分别分析,不能把传感器的五点平均解释成整套场景 GI。
局部灯光方面,绝区零明确构建屏幕分区与世界网格两套候选列表:先包围范围粗筛,再按深度/格子相交过滤,消费者按压缩表头查列表。它解决“这里需要算哪些灯”,与“这里已有多少烘焙/环境光”是两个不同问题。原神和终末地不能因为有空间表或体积就自动套用同样的列表结构。
细节来源:绝区零灯光与烘焙材质、原神空间查询与环境反馈、终末地三层方向光照。
4. 表面怎样接受湿润、积雪与环境变化
| 光照前的材质颜色 | 最终雪城局部 |
|---|---|
![]() |
![]() |
观察中间栏杆顶面、两侧台阶和树冠。 材质阶段已经形成积雪与基底的颜色分区,最终画面再出现明显的蓝色环境受光和台阶阴影。这里能看出雪覆盖先进入材质、再参与光照;这是材质到最终输出的阶段对照,不是“关闭雪材质”的结果。
绝区零用世界高度、朝上程度与湿润噪声控制影响范围,随后同时修改颜色、表面响应参数和法线细节。湿润不是最终颜色上的单一深色遮罩,它可以把细微法线往平坦方向拉回。
原神的雪场景先把可接受的表面高度与层差写入缓存;可见雪材质再以顶点色、覆盖方向和法线控制两层表面的混合。本帧方向覆盖包含
顶点色.B×smoothstep结果,另一层遮罩又乘顶点色
B。底层和雪层各自有颜色、法线与控制量,闪光细节还写出供历史策略读取的高位分类。
终末地本次已深入确认的是位置/方向光照和雾如何进入表面与角色求值,尚未完整分析与湿润或积雪对应的天气覆盖材质。因此不能把“这一帧未还原”写成“该游戏没有对应能力”。
这些机制的共同点是环境先改变材质求值输入,再影响颜色与后续处理。覆盖规则、世界寻址和分类输出属于材质实现的一部分,不能只移植最后的颜色插值。
5. 阴影的区别在生产、缓存与消费者
| 问题 | 绝区零 | 原神 | 终末地 |
|---|---|---|---|
| 阴影深度从哪里来 | 可见几何、专用代理及附加角色阴影 | 动态几何和压缩烘焙结果 | 分区阴影视图与其他深度路径 |
| 已确认的缓存机制 | 局部图集/数组,屏幕解析后再按对象处理 | 烘焙数据按块查树,解码平面或小块量化深度后写入图集 | 不同区域更新,公共阴影供表面与雾读取 |
| 特殊的后续消费 | 角色分类、附加脸部阴影、对象级遮蔽 | 多尺度屏幕过滤,角色环境采样也读取阴影 | 几何遮挡同时改变表面受光与空气中的散射 |
原神的关键差异是压缩存储与实时比较采样之间多了一个解压层:静态阴影先以分块节点与载荷保存,使用前恢复成常规深度附件,从而与动态几何进入相同的比较采样和过滤路径。
绝区零的关键差异是可见形状、阴影代理和对象分类各有职责:需要保留代理对遮挡的表达,以及分类对后续作用范围的限制。终末地则展示了表面与体积共用遮挡信息:同一个阴影输入还决定雾里哪些空间能收到光。
图集布局能证明区块化使用,但单帧不能还原所有区块的刷新频率和分配策略。详细记录分别在三篇场景分析的阴影部分。
6. 反射颜色的来源决定依赖什么
| 机制 | 颜色来源 | 必须先有的数据 | 当前证据边界 |
|---|---|---|---|
| 绝区零镜像视图 | 从镜像视点重新完成场景着色 | 镜像视图的几何、深度、材质、光照和透明结果 | 与环境探针的全部材质混合规则未完整拆解 |
| 原神间接/反射链 | 屏幕数据与空间结构共同生成的候选颜色 | 法线/深度、场景颜色与空间查询结果 | 追踪、回退及漫反射/镜面分量分离仍有未知项 |
| 终末地历史取色 | 从上一帧 HDR 画面按追踪坐标读取 | 当前深度/法线、坐标及有效性数据、旧 HDR | 坐标消费与过滤已确认,射线步进和未命中回退未完全还原 |
绝区零反射的可见性由另一个观察视点重新决定。终末地的重建则把“去哪里取色”与“取得什么颜色”分开:半分辨率坐标服务全分辨率取色时加入
2×2 子像素补偿,颜色再以 C/(1+max(C))
压缩后进入过滤层级。
由输入来源可以推出,镜像分支需要额外视图内容,历史取色分支需要有效旧画面。单帧不足以比较二者实际耗时或未命中效果;尤其不能把尚未拆出的回退策略补成某种探针或光追实现。
终末地旧 HDR 同时供反射与时序读取,两个消费者都结束后才能换成新历史。这是它比“颜色历史只用于抗锯齿”更严格的读写依赖。
7. 环境遮蔽分别在近似什么
| 环境遮蔽系数预览 | 相同区域的最终地面 |
|---|---|
![]() |
![]() |
观察左下石块下沿、中央横向石阶和右侧长石阶。 遮蔽图的深色带对应这些接缝,白色区域表示较少遮蔽;右图给出它们在最终地面中的位置。系数图统一显示范围为 0–0.67。最终颜色还包含材质和直接阴影,所以这张配对图用于定位 AO 的作用区域,不把右图全部暗部归给 AO。
绝区零的屏幕遮蔽之外,角色还使用胶囊空间几何近似局部遮挡;原神将屏幕遮蔽与空间遮蔽场处理结合;终末地已能还原到方向搜索、历史拒绝、打包边缘和上采样的具体链路。
终末地的方向核心沿三个方向、三个距离、正负两侧取深度,再以法线和上下遮挡边界求遮蔽。后续步骤分工明确:
- 运动和深度差分别衰减旧遮蔽的可信度;当前 3×3 范围约束历史值。
- R8 边缘图用四个 2-bit 值表达相邻方向的连续性,滤波需要中心与邻居双方允许跨越边界。
- 两轮保边后再五点上采样,最后一步不重新读取深度。
胶囊遮挡知道简化物体的空间形状,屏幕方向搜索知道当前视图中的深度邻域。它们近似的输入不同,可以互补;当前没有足够证据为绝区零和原神的全部 AO 核列出与终末地同等精度的参数表。
8. 雾的局部贡献与累计结果要分开
原神已确认先在三维网格中结合灯光、阴影、噪声和历史,经过后续体积处理再合成到表面。终末地进一步确认了局部散射/消光体积与沿视线累计体积的分工:
本层透射 = exp(-消光×层厚);累计散射要乘此前剩余透射,累计透射则继续乘本层衰减。
因此“局部体素有多强的雾”不等于“从相机到这个表面已经积累了多少雾”。角色直接读取累计颜色和透射时,才能与场景共享一致的视线衰减。绝区零本次能确认屏幕雾生成和合成,内部介质存储尚未完整还原,不能强行套成相同的体积结构。
9. 历史拒绝和颜色重建不是一个固定混合系数
| 时序融合输入 | 时序融合输出 |
|---|---|
![]() |
![]() |
观察左侧栏杆的细碎亮点与右侧雪坡。 输入保留大量孤立亮点和较硬的细边缘,融合后亮点更集中、局部纹理和轮廓也更柔和。这组同区域、同显示设置的图直接展示本次时序重建的变化,同时能看到细节变软的代价;单帧对照不证明运动中的拖影或闪烁表现。
| 机制 | 绝区零 | 原神 | 终末地 |
|---|---|---|---|
| 主运动的非线性解码 | 有符号平方,中心为 127/255 | 有符号平方,中心为 127/255 | 有符号四次方,中心为 0.5 |
| 强拒绝历史的主要依据 | 当前/历史像素身份差值超过 0.1 | 重投影越界、运动/覆盖控制与状态;分类影响颜色约束 | 当前/历史深度、运动与类别变化,另汇总低分辨率遮罩 |
| 历史颜色如何受当前画面约束 | 在压缩颜色域中进行邻域限制 | 当前 4×4 重建及条件式历史颜色区间 | 独立历史验证信息参与后续 HDR 融合 |
| 一个可确认的动态控制 | 历史基础比例 0.95-0.25×saturate(5000×速度) |
累积量上限 12-10×saturate(6000×速度) |
运动、深度和类别的变化先编码为有效性标记 |
| 必须同时保存的状态 | 颜色 + 像素身份 | 颜色 RGB、其 A 控制标记 + 两通道历史状态 | HDR 颜色及附加状态 + 深度 + 运动/分类 |
这些控制量位于不同层次,不能只比数字大小:
- 绝区零先检查历史身份差,再约束压缩颜色域里的旧值,最后按运动减少混合权重。
- 原神先重建当前 4×4
邻域和五点历史颜色,再结合保留状态、覆盖控制与材质高位决定约束方式;最终当前比例为
W/(W+12H),W 是本次重建权重和,H 是受控制的历史累积量。 - 终末地先从前后深度、运动与分类形成有效性信息,再汇总低分辨率遮罩供 HDR 颜色融合使用。
共同需要运动正确、历史版本一致、颜色处于正确处理阶段;各自拒绝依据和重建核则不能只换一组参数就相互替代。详细公式分别在三篇场景分析的时序部分。
10. 后处理顺序改变历史累计的对象
| 游戏 | 与本次主要历史融合的关系 | 直接含义 |
|---|---|---|
| 绝区零 | HDR 时序之后继续主要泛光、运动模糊与最终颜色处理 | 身份历史与 HDR 颜色一起维护;角色颜色查表还可能更早发生 |
| 原神 | 运动模糊、泛光和最终颜色先完成,再做空间抗锯齿与历史重建 | 历史约束针对后处理颜色,不能直接按另一套 HDR 历史解释 |
| 终末地 | HDR 验证/融合之后提取高亮、做多尺度 Bloom,再最终合成 | 高亮提取和过滤消费时序稳定后的 HDR |
终末地 Bloom 的下降层保留细尺度结果,上升时用三次重建的粗尺度结果与它们混合;高亮预滤波还同时使用软阈值和亮点降权。这里已还原的是具体滤波和混合逻辑,而非仅有一条纹理尺寸清单。另两帧的整套 Bloom 核尚未以同等精度完成逆向,不能凭程序名宣称相同。
11. 实现时必须保留的阶段关系
| 数据关系 | 对应机制 | 打破关系会丢失什么 |
|---|---|---|
| 表面数据与类别一同读取 | 绝区零材质通道分支、原神材质高位、终末地模板筛选 | 同一数值被错误解释或进入错误着色路径 |
| 法线用完后才能改写运动 | 原神纹理顺序复用 | 光照读到位移,或时序仍读到方向 |
| 反射与时序读完旧 HDR 再换版本 | 终末地共享历史 | 反射与重投影使用不同帧或被覆盖的数据 |
| 局部雾更新先读已有累计体积 | 终末地体积反馈 | 前次反馈在消费前丢失 |
| Bloom 下降层保留到对应上升 | 终末地多尺度合成 | 粗层无法与本层细节重新组合 |
| 角色环境先读已有反馈、后汇总 | 原神环境传感器 | 改变角色接受环境变化的时序与平滑行为 |
这些约束来自算法消费者,不来自资源名字。复制 shader 时同样需要保留分类、编码、颜色域与历史有效性;通道格式相同不足以证明可以共用解码器或临时存储。
12. 比较边界
本文比较的是三个具体截帧中已观察到的机制。没有连续帧就不能恢复完整缓存周期,没有可比计时就不能据此排名性能;未还原的分支不视为游戏缺失该功能。
原始输入、定位与状态由 证据索引 保存。需要某个游戏的实现细节时,以开头链接的独立分析为主;本篇保留机制之间的差异和相互约束。








