0%

终末地角色实现分析(竹林场景截帧)

由 astra 生成 · 更新于 2026-09-27 18:44(北京时间)

分析日期:2026-09-27。分析多角色竹林场景中已确认的后续几何着色、方向环境光、辅助几何反馈与公共运动接口,不沿用此前角色展示截帧的部件结论。

本文独立展开角色实现。公共光照、反射、雾和整帧后处理见 终末地场景分析;完成单游戏分析后的横向结论见 角色实现对比。

配图直接来自真实回放,关键效果用同一区域的阶段前后图解释。局部图已统一到便于阅读的方向,HDR 配对使用一致显示范围;最终画面另作外观参照。公式和通道按实际读写解释,未确认的部件归属明确保留。

1. 屏幕辅助数据会反馈到几何处理

数据步骤 处理规则 后续用途
主材质 建立表面颜色、法线、材质参数、运动与深度 供公共光照和辅助路径读取
分离辅助可见性 复制主法线与深度到独立目标,保留尚未写入的辅助颜色 辅助路径可以继续处理自己的表面关系
辅助几何栅格化 写八面体法线、alpha 中的对象/材质标记及深度 为后续几何建立可采样的空间与分类信息
辅助标量计算 根据相关输入生成标量图及辅助深度 标量的完整物理意义仍待确认
辅助几何求值 顶点阶段读取上述法线、标量、深度与标记,并更新几何数据 生成辅助颜色/法线,同时接回公共运动图

这里已确认的机制是“先栅格化辅助表面信息,再把纹理结果交回顶点阶段”。这与只在最终屏幕上叠加一张效果图不同;几何处理同样可以是屏幕数据的消费者。辅助路径还通过深度、模板与独立颜色混合控制接入范围,完整部件用途未确认。

2. 延迟之后的几何直接消费环境

全屏延迟光照结束之后,几何路径继续向主 HDR 颜色与运动图写入。前后对照可见,角色颜色在这里得到补充,因此角色的完整着色没有全部交给前面的全屏程序。

已拆解的几何路径使用相等深度测试,在已有可见表面位置写入颜色与运动;像素程序直接读取三层空间光照场和累计雾散射/透射体积:前者提供当前位置的环境光,后者提供相机到该表面之间的雾色与透射。角色几何在自己的着色阶段接入环境,而不是只依赖前面的全屏光照。

全屏光照结束 后续几何着色完成 最终角色外观
全屏光照结束 后续几何着色完成 最终角色外观

观察角色轮廓内部,背景位置保持一致。 全屏光照结束时角色仍是黑色轮廓;后续几何阶段填入金发、肤色、白裙与金属亮部,直接证明角色颜色在这一阶段补入。前两图统一采用 HDR 显示范围 0–0.2,第三图为最终输出色彩;这里比较的是阶段贡献,不是 GI 或阴影开关。

主材质用于建立或更新表面,后续几何用于在已有表面位置补着色;两者的深度测试职责不同,移植时需要分别保留。

3. 后续几何着色的材质公式、方向控制与运动输出

代表后续几何程序已经能继续拆到材质计算。以下是此程序的已确认机制;它属于会补入角色颜色的事件组,但尚未证明该组所有匿名程序都有完全相同的材质分支。

金属与非金属响应分开构造。 程序使用 0.04 的介质反射基值,把一个材质混合量分别用于漫反射颜色和镜面反射颜色:

1
2
3
漫反射颜色 = 表面颜色 × 0.96 × (1 - 金属混合量)
镜面基色 = lerp(0.04 × 介质反射缩放, 表面颜色, 金属混合量)
高光宽度量 = max(粗糙度类参数², 0.0078)

这支持将该混合量解释为金属/非金属控制,而不只是“某个材质参数”。但尚未逐个证明输入贴图各通道在所有材质变体中的同名意义,因此这里限定为本程序的运算语义。后面还可以按其他条件把高光宽度混向 0.01,说明视觉高光并非只由一张统一 roughness 贴图决定。

明暗分区同时使用几何方向与贴图方向。 程序将主光方向压到水平面,加入小的竖直分量再归一化;根据局部光方向符号镜像 U,采样材质控制纹理。其 B 通道被重建为一个平面方向:

1
2
3
带符号横向量 = 根据光照侧别选择 (2×B-1) 或 (1-2×B)
贴图方向 = normalize(带符号横向量, 0.0001, 1-abs(带符号横向量))
着色方向 = normalize(lerp(变换后的贴图方向, 几何法线, 材质混合量))

同一采样的 R/G 平均值还与光方向推导的阈值做 smoothstep,构造明暗分界;分界参数限制在 0.001–0.999,避免退化区间。随后把明暗控制映射到横坐标、以纵坐标 0.5 采样一条色彩 ramp。因此这个路径组合了几何法线、贴图设计的分界与渐变查表,不能仅替换成普通 saturate(N·L)。

环境光包含方向性。 对场景三层光照体积解码后,红/绿/蓝各自得到四个系数,用 (着色方向.x, 着色方向.y, 着色方向.z, 1) 求点积并限制为非负。这是包含常量项和一阶方向项的环境光,而不是给角色乘一个与法线无关的 RGB ambient。体积的尺寸、分层和打包公式见 终末地场景分析。

运动输出与颜色并行写入。 当前与前一投影坐标差先变成纹理位移,再经两次平方根压缩:

1
2
屏幕位移 = (当前NDC - 前一NDC) × (0.5, -0.5)
编码RG = 0.5 + 0.5 × sign(屏幕位移) × sqrt(sqrt(abs(屏幕位移)))

代表程序同时写 B=1、A=0.4。因为目标是 RGB10A2 UNORM,A 只有 2 bits,实际只有 0、1/3、2/3、1 四档,0.4 落入 1/3 档;后续按接近 0.3 的范围判断分类正是要匹配量化后的值。不能把 shader 中的 0.4 当作读回后完全精确的值。

雾最后作用于已算出的几何颜色。 程序采样累计雾体积,以 RGB 表示沿视线散射、A 表示透射,与解析高度雾等项组合,再把几何颜色乘以综合透射并加入雾色。颜色路径被雾衰减时,运动输出仍独立写入,保持时序重投影需要的几何对应关系。

证据:后续几何着色程序、实际资源与常量绑定。

4. 辅助合成与透明阶段保留公共接口

辅助颜色阶段再次写入独立辅助颜色图并使用辅助深度,随后合成回主 HDR。本帧路径的 depth 为 Less、关闭写深度;stencil Equal、mask=1、ref=1;颜色按 One / InvSrcAlpha 混合,只写 RGB。它先根据深度与分类筛选像素,再叠加辅助颜色;不能仅凭这一步断定具体角色部件。

透明/效果阶段继续写 HDR 颜色和运动矢量/分类图。最后,时序预处理读取当前运动矢量、当前深度以及前一帧的对应数据,判断历史是否仍然可信。角色、效果与场景必须先完成这些公共输出,再统一进行历史融合;完整历史图与 Bloom 见 终末地场景分析。

5. 分析边界与证据

对照图已确认后续几何路径会补入角色颜色;辅助几何的具体部件归属、脸/眼/头发分别采用哪些完整公式、每个角色的变形数据来源仍未全部还原。本文的材质公式限定为已拆解的几何程序,不将它冒充所有角色部件的统一实现。

角色绑定证据 保存原始状态,资源语义索引 对照数据用途;捕获编号和提交统计只用于附录定位。