由 astra 生成
以竹林场景这份截帧为例,先统计人物、石质表面、地表与竹叶冠层资源,再用整帧流程定位执行阶段。正文按环境受光、阴影、接触暗部、反射、雾、人物外观、画面稳定、泛光与显示色彩组织,各效果内结合实际输入、计算过程与阶段对照展开分析。
美术资源与渲染概况
美术资源概况
- 人物先建立表面,再补专用照明。 脸与身体有各自图集,同一几何会在主材质和后续着色中承担不同工作。
- 地表同时使用局部材质与大范围共享数据。 2K 石质图集、8K 拼块资源、地表参数、纹理数组和深度在不同路径中组合。
- 竹林同时使用细叶片与低面数冠层。 已定位的调用从每实例 12 个三角形到 6444 个三角形不等,实例数量也明显不同。
渲染分析概况
| 画面效果 | 本帧的主要实现 |
|---|---|
| 竹林环境受光 | 三层空间数据按位置与表面方向恢复低阶环境光 |
| 阴影与接触暗部 | 光源阴影控制受光,AO 经方向搜索、历史与保边过滤形成局部遮蔽 |
| 反射与空气层次 | 屏幕反射读取旧 HDR 并与环境探针混合,雾分别累积散射与透射 |
| 人物形变与外观 | 压缩方向与蒙皮建立表面,后续专用材质补入角色颜色 |
| 画面稳定与泛光 | 深度、运动和类别验证历史,HDR 融合后再进行多尺度亮部重建 |
样本条件
主视图与输出为 3440×1440,接口为 Vulkan。当前分析只对应这份竹林场景及其中人物;没有将另一角色展示场景的材质或后处理机制移入本文。
正文先用模型范围、纹理和实例统计解释资源,再用流程图定位阶段、按画面效果分析实现。阶段 HDR 对照使用相同显示范围,最终截图另作外观参照;所有辅助线框和算法示意均在图注中说明。
美术资源详细统计
渲染提交统计
下表按执行顺序合并连续阶段区间。每行包括区间内的相邻准备或合成工作,不将整段计数当作某一个效果的独占开销。绘制包含主视图、阴影、全屏处理及界面;计算分派单列。
| 连续阶段区间 | 绘制次数 | 计算分派 | 提交三角形数 |
|---|---|---|---|
| 初始准备、阴影与雾更新 | 393 | 10 | 1,898,139 |
| 早期深度 | 153 | 0 | 404,625 |
| 主视图材质 | 455 | 0 | 1,375,297 |
| 贴花、辅助数据、AO 与反射准备 | 59 | 35 | 72,081 |
| 场景照明 | 6 | 0 | 6 |
| 后续角色、辅助几何与透明效果 | 207 | 0 | 436,623 |
| 整帧历史处理 | 8 | 0 | 724 |
| 泛光、后续合成与界面 | 45 | 20 | 637 |
| 全帧合计 | 1,326 | 65 | 4,188,132 |
三角形按实际拓扑与实例数计入:三角形列表的一次提交量为“索引数 ÷ 3 × 实例数”。同一几何进入不同视图或阶段会重复计数;点形式的几何准备计入绘制次数,但不计作三角形。这里没有 GPU 时间数据,不能用调用或面数直接评价耗时。
下面改按资源对象拆开说明。每个部件的数字只对应已定位的代表提交,避免把整帧重复工作误当作唯一模型规模。
人物资源
模型与着色分阶段处理
主材质阶段可以分别定位脸部、身体和另一名角色的几何。场景照明之后,人物还通过后续几何路径补入专用颜色;这时的再次提交承担着色任务,不代表多出了一套独立模型。
| 代表几何 | 索引数 | 三角形数 | 本次实例数 |
|---|---|---|---|
| 中央角色脸部 | 10590 | 3530 | 1 |
| 中央角色身体的一组部件 | 59679 | 19893 | 1 |
| 左侧角色的一组身体部件 | 43773 | 14591 | 1 |
| 后续脸部着色的对应几何 | 10590 | 3530 | 1 |
最后一行在整帧中再次发生,不能与第一行相加当作面部模型面数。上表也没有覆盖每个人物的全部头发、配饰与透明部件。
黄色线框只标出这次提交。脸部图与身体图各自保持与最终图一致的位置和裁切;早期尚未出现的头发、衣片或场景背景,不代表纹理丢失。后面的纹理清单覆盖四名角色,并合并核对各阶段绑定。
脸部、身体与其他角色的图集
这份竹林截帧中有四名角色。下面逐项列出人物材质绑定的 136 份去重纹理资源:覆盖主材质、后续受光、描边以及毛发和衣料的透明叠加阶段,也检查了这些资源在阴影与深度阶段的复用。立方体按一份六面资源计数;同一资源被不同部件或多个阶段复用时只列一次。这里的完整范围是当前截帧中的绑定资产,不能据此推断游戏安装包里所有角色资源。
中央角色 · 左侧角色 · 后方角色 · 右侧角色 · 共用图案与查表
底色、方向和控制图分别列出,尺寸与格式使用截帧中的实际规格。预览保留纹理坐标方向,脸部展开可能倒置;RGB 预览保留完整图集,最终轮廓还需要 alpha、覆盖控制或独立几何。窄条渐变和查色表仅纵向放大,便于阅读;它们不等于一张普通角色底图。
BC5 只储存两个方向通道,预览偏黄绿。毛发双方向图则使用 RG、BA 恢复两套方向。描边控制图在顶点阶段读取,不能漏掉,也不能把它当作普通表面 AO。
中央角色:脸、皮肤、装备、衣装与毛发
左侧角色:脸、皮肤、外套、配件与织物
后方角色:脸、皮肤、服装与随身物件
右侧角色:脸、皮肤、内层服装、外套与长发
共用图案、专用查表与默认资源
这里同时收录跨角色复用的纹理和便于比较而集中展示的专用查表。“使用角色”明确当前绑定关系,不能把每一张都理解为四名角色通用。不同资源即使预览相似,也保留各自条目。屏幕深度、阴影、环境体积和累积雾等运行时结果见下方接入表。
运行时照明与屏幕输入怎样接到角色
这些输入也确实被人物程序读取,但由本帧或已有环境状态生成,与上表的固定材质资产承担不同职责。它们在各自的效果章节中配图展开,不混入某名角色的底色或法线清单。
| 输入 | 本帧规格 | 角色侧的用途 |
|---|---|---|
| 屏幕遮蔽及相关控制 | 3440×1440,RG8 | 接入已有表面遮蔽条件,见接触暗部 |
| 光源阴影 | 6144×4096,D16 | 判断主光等受光是否被遮挡,见阴影 |
| 三层环境幅度与方向 | 每层 128×64×128 幅度、128×192×128 方向,共六份体积 | 按角色表面位置与方向查询环境照明,见环境光 |
| 累积雾 | 313×180×128,RGBA16F | 角色按自身深度合成空气颜色与透射,见体积雾 |
| 屏幕深度与阶段辅助目标 | 主视图尺寸 | 毛发、描边及透明叠加路径的深度关系和合成条件 |
同一张身体底图会在主材质、后续着色、描边或透明层中再次出现。只有把这些阶段合在一起检查,才能同时看到底色、法线、控制、查表和扩张遮罩;仅截取某一次颜色绘制的绑定列表会遗漏其他输入。
输入流同时包含浮点和压缩属性
中央身体绘制的输入包括 12 字节浮点位置、双通道 32 位浮点坐标、4 字节带符号归一化向量,以及四通道 16 位归一化和四通道 8 位整数属性;还存在独立的归一化颜色类输入。
这些布局分别承载位置、压缩方向、坐标、骨骼权重与索引等输入。对照相同原始程序的语义还原,可以确认压缩切线基和一、二、四影响蒙皮的分支;后文展开解码及当前/旧位置如何生成。输入精度、字段含义与实际选择的分支需要一起理解。
人物可见几何建立后,晚些时候的着色可以用相等深度测试找到同一表面,再把空间环境光、阴影和雾的结果接入。资源拆分、可见性与后续着色是连续关系,不能只看最后一次绘制的纹理列表就推断整个人物的生产流程。
地表与石质场景资源
地表资源需要按实际表面定位
前景石阶、远处石质构件与复用地表数据的小几何不是同一个资源对象。远景提交读取的石砖图集不能用来说明整片前景石阶的材质。下面以已经定位的共享地表路径说明其图集、数组与屏幕输入;仍未确认全部前景表面各自使用哪一块图集。
共享地表输入并不局限于一整块地形
另一条实例几何提交每实例只有 449 个三角形,但共有 129 个实例,合计提交 57921 个三角形。它同时读取大尺寸拼块图集、地表数据、纹理数组和屏幕深度。
| 实际读取的数据 | 本次规格 | 已确认的信息 |
|---|---|---|
| 大尺寸颜色图集 | 8192×8192,BC3 sRGB | 多个颜色区块拼接,存在未使用或黑色区域 |
| 两张方向类图集 | 8192×8192,BC5 | 与颜色图同时参与表面求值 |
| 数值控制图集 | 8192×8192,BC3 | 提供区域数值输入 |
| 大范围地表颜色与参数 | 4224×2112,BC3 sRGB/RGBA8 等 | 与局部图集一起读取 |
| 纹理数组 | 单层 1024×1024 | 以数组方式组织的材质输入 |
| 当前屏幕深度 | 3440×1440,单通道浮点 | 材质计算的屏幕空间条件 |
颜色图被打包成区块,与大范围地表输入共同使用,可以确认这条几何复用了地表系统的数据。仅凭 8K 图集和空白区,还不能完整还原虚拟纹理页表、驻留替换或流送策略;也不能把这 129 个实例直接当成 129 个独立地形瓦片。
图集的实际尺寸与截图中物体大小不是一回事。一个画面中很小的实例也可能读取大范围共享资源;材质成本还取决于采样、覆盖和层次选择,不能只用“8K”推断本次渲染开销。
竹林与树冠资源
高细节叶片与低面数树冠同时存在
| 已定位的一组植被 | 每实例三角形 | 实例数 | 本次提交三角形 |
|---|---|---|---|
| 低面数树冠面片组 A | 18 | 256 | 4608 |
| 较细的竹叶几何 | 6444 | 13 | 83772 |
| 低面数树冠面片组 B | 12 | 658 | 7896 |
三张线框来自各自的实际提交,底图随主材质绘制逐步补齐。低面数树冠用很少的三角形承载一簇叶冠图案,另一组竹叶则使用更多几何描述细节。本帧能确认两种资源形式同时参与画面;它们是否属于同一植被资产的不同 LOD,以及切换阈值是多少,需要其他距离或连续帧验证。
植被图必须结合覆盖通道显示
| 植被资源 | 颜色与控制尺寸 | 颜色预览 |
|---|---|---|
| 树冠组 A | 两张 512×512,颜色为 BC7 sRGB,控制为 BC7 | ![]() |
| 竹叶几何 | 两张 1024×1024,颜色为 BC7 sRGB,控制为 BC7 | ![]() |
| 树冠组 B | 两张 512×512,颜色为 BC7 sRGB,控制为 BC7 | ![]() |
上表以同一颜色纹理的 alpha 显示覆盖,灰色是预览背景,图集方向按纹理坐标保留。原先只显示 RGB 时,轮廓外无覆盖区域的 RGB 也出现了,看起来像整块矩形或破碎色块;那些区域不等于最终叶片。
树冠图包含较完整的枝叶簇轮廓,叶片图则把细小叶片组织到一张图集。二者承担的表示尺度不同:细模型依靠较多几何表达轮廓与摆放,低面数模型把更多轮廓细节交给图案和材质。
两组主要叶片调用采用相等深度测试并关闭深度写入,复用之前建立的可见性;另一树冠变体仍写深度。由此可见,植被也不能作为一个固定状态的统一 Pass:可见性准备、叶片材质和远处冠层分别有自己的处理规则。
一条 658 实例的调用只提交 7896 个三角形,而 13 实例的细竹叶就提交了 83772 个三角形。这个例子说明,“实例多”与“几何多”不是同一个指标。像素覆盖和被丢弃的叶片背景又属于另一类成本,单纯用三角形数量无法排序所有植被开销。
环境与中间资源
竹林照明同时使用屏幕数据和空间数据。下表先说明资源规模,后文再沿生产与消费关系解释算法。
| 数据 | 本次布局 | 保存内容 |
|---|---|---|
| 材质颜色 | 3440×1440,RGBA8 sRGB | 供照明读取的表面色 |
| 法线、材质控制、运动 | 分别为全分辨率 RGB10A2 | 人物分支分别保存方向、按位拆分的实体标记、压缩运动与类别 |
| HDR 颜色 | 全分辨率,R11G11B10F | 场景与人物逐步加入的照明颜色 |
| 阴影代表输入 | 6144×4096,16 位深度 | 光源方向的遮挡 |
| AO 主要工作尺寸 | 1720×720 | 局部环境遮蔽和过滤数据 |
| 累积雾 | 313×180×128,RGBA16F | 视线散射颜色与透射率 |
| 环境光幅度 | 三组 128×64×128 浮点体积 | 不同空间层级的幅度数据 |
| 环境方向系数 | 三组 128×192×128 归一化体积 | 每层将 RGB 三组方向系数分段保存 |
环境幅度与方向系数按近、中、远层组织。这里“三组”对应三个空间层级,不是简单的红、绿、蓝三张独立体积;每次查询会一起恢复颜色及其随表面朝向变化的响应。
当前画面还有明显的竹林远景与天空亮部,但单凭它们的外观不足以确认一套独立云或水算法。后文集中解释已沿实际资源确定的阴影、环境光、遮蔽、反射与雾。
渲染分析
先用整帧流程定位执行阶段,再按下面的画面效果阅读。每个效果章节先交代画面作用,再展开实现技术、数据流与截帧证据;资源尺寸和几何统计见前一部分。章节顺序用于阅读,实际执行先后以流程图为准。
| 画面效果 | 本文展开的实现与证据 |
|---|---|
| 植被轮廓与方向 | 前置 alpha 剪裁、颜色覆盖复用、方向编码与双面处理 |
| 方向性环境受光 | 三层空间覆盖、一阶系数与表面方向查询 |
| 光源遮挡 | 阴影图集同时进入表面照明与雾更新 |
| 接触暗部 | 方向搜索、角度积分、历史稳定与保边过滤 |
| 表面反射 | 分块查询、深度命中、历史校验、粗糙过滤与环境探针补足 |
| 雾与空气 | 局部散射/消光、深度积分与场景/角色合成 |
| 人物形变 | 压缩方向、骨骼混合和双时刻位置 |
| 角色外观与受光 | 阶段对照、身体法线、脸部色调与明暗控制 |
| 晚期受光面片 | 烟雾图集、柔和交界、受光、加色与运动目标混合 |
| 抗锯齿与画面稳定 | 抖动/运动分离、历史验证、重建与置信状态 |
| 亮部泛光 | 软阈值、亮点抑制、下降过滤与上升重建 |
| 锐化、暗角与显示色彩 | 五点锐化、颜色缩放、暗角、对数查表与显示抖动 |
整帧流程与表面数据
整帧流程先交代场景、角色与后处理的依赖,再说明各效果共用的表面数据。辅助几何反馈已经确认读写链,但具体部位未定,因此也在本节保留其范围说明。
从上向下跟随箭头阅读。每个阶段说明实际工作与输出结果;阶段标题可跳转到对应分析。箭头表示主要执行次序,颜色、深度等数据可以跨过多个阶段继续使用。
-
准备阴影与前置几何
- 工作
- 准备并绘制光源方向的可见几何,建立阴影深度;这些遮挡信息随后同时服务表面和空气受光。
- 输出
- 光源可见性与阴影深度 → 体积雾、场景和角色着色。
-
- 工作
- 局部更新散射和消光,结合灯光、阴影及已有体积状态,再沿视线逐段累计散射和透射。
- 输出
- 累积雾体积 → 后续场景与角色按位置查询。
跨次输入已有雾状态参与更新。它拥有独立的空间存储与累计关系。
-
可见性主视图预深度
- 工作
- 从当前相机建立可见表面的深度覆盖,为后面的材质和屏幕处理提供位置基础。
- 输出
- 主视图深度 → 主材质及屏幕空间处理。
-
表面主视图材质
- 工作
- 场景与人物写入材质色、编码法线、参数、运动和类别等数据;人物部分的专用照明颜色仍留给后续阶段建立。
- 输出
- 表面数据与深度 → 遮蔽、反射、场景照明和人物着色。
-
辅助表面贴花与辅助几何
- 工作
- 继续处理贴花,并为辅助几何组织单独的法线、深度和标记等屏幕数据,形成后续反馈输入。
- 输出
- 更新的表面数据及辅助反馈 → 环境处理、后续几何与合成。
-
环境屏幕环境遮蔽
- 工作
- 沿屏幕方向搜索遮挡,结合旧遮蔽结果稳定当前估计,再做保边过滤和分辨率恢复。
- 输出
- 稳定后的 AO → 场景及相关表面受光。
跨帧输入这里读取遮蔽自身的历史,不使用整帧颜色历史替代。
-
环境反射取样与重建
- 工作
- 按屏幕块分配查询预算,在当前深度中搜索反射位置,用运动和旧深度验证对应;读取旧 HDR,分别过滤反射颜色与有效权重,再与环境探针混合。
- 输出
- 当前反射输入 → 场景照明。
跨帧输入旧 HDR 在这里先被读取,后面的整帧时序还要读取;保存新颜色时必须保留这一顺序。
-
照明场景全屏照明
- 工作
- 按材质与类别解释表面数据,接入已有的方向环境光、阴影、AO、反射及相关雾输入,建立场景照明。
- 输出
- 场景 HDR 颜色 → 后续人物与效果;部分人物颜色仍未完成。
已有资源方向环境光按空间位置与表面朝向查询;本段没有证明其全部生产过程都发生在这次截帧内。
-
人物后续角色几何着色
- 工作
- 再次绘制角色可见几何,以相等深度匹配主材质阶段的表面,把专用材质、受控明暗、空间环境与雾写入颜色。
- 输出
- 补入角色后的 HDR 颜色与运动 → 后续辅助和透明合成。
-
- 工作
- 处理晚出现的辅助几何与受光效果面片;由深度差控制柔和交界,按材质模式混合 HDR,同时通过独立目标处理运动与类别。
- 输出
- 完整的当前颜色、深度、运动和分类 → 整帧历史验证。
-
- 工作
- 比较前后深度、运动和类别,汇总邻域有效性;再对当前与旧 HDR 颜色进行约束和融合,更新置信状态。
- 输出
- 稳定后的 HDR → 泛光;更新的颜色与状态 → 后续帧。
历史分工整帧颜色、AO、反射和雾具有各自的读取及更新关系;不能用一个统一的历史节点代替它们。
-
后处理多尺度泛光与末段合成
- 工作
- 用软阈值提取高亮,逐层下降过滤,再向上重建扩散颜色,并继续处理末段的光晕或模糊支路。
- 输出
- 泛光及末段颜色结果 → 最终显示合成。
-
- 工作
- 完成最后的颜色输出及界面合成,把当前结果写成可显示的整帧画面。
- 输出
- 最终显示画面。
依据本次截帧的执行顺序整理;下方阶段画面用于观察颜色怎样逐步建立,详细算法继续在后文展开。
沿同一视角观察颜色的建立
场景照明和人物着色两张图都以 0 到 0.2 的 HDR 范围并作显示伽马转换。材质色与最终图各有自己的颜色含义,不用它们的直接亮度差反推单项光照强度。
效果共用的表面颜色、方向与分类
表面色已经能识别植被、石阶和角色,法线保存方向;此时 HDR 目标大体接近黑色。这组图说明表面信息与受光颜色处在不同数据中。
八面体编码怎样保存方向
三维单位方向只有两个独立自由度,可以用两个分量保存。这里的法线采用八面体编码:先按方向分量的绝对值总和投影,再把下半部分折叠到二维区域。
图中两个通道的颜色不能直接当作世界横纵分量。AO 读取时先恢复三维单位方向,再变换到观察空间,与深度一起计算邻域几何关系。
表面颜色按 sRGB 储存,方向与控制则按数值编码。解释这些输入时,色彩转换、方向解码和分类读取需要分别处理。
分类照明怎样加入已有颜色
全屏照明按模板类别筛选表面,再执行对应分支。已确认的合成为:
这里 alpha 控制已有贡献的保留程度,不应自动解释为常规透明物体的覆盖率。类别、输出数值与混合设置共同决定最终贡献。
一轮全屏照明结束后,某些角色区域仍未完成颜色。后面的几何着色直接读取环境光与雾,把专用材质接入当前 HDR。
辅助反馈准备:数据链已确认,具体部位未定
这一帧存在一条独立反馈链:
| 步骤 | 保存或读取什么 |
|---|---|
| 分离辅助可见性 | 复制主法线与深度,保留尚未写入的辅助颜色 |
| 辅助几何栅格化 | 写入方向、分类标记和深度 |
| 辅助标量计算 | 根据这些输入生成标量及另一份深度 |
| 后续几何求值 | 顶点阶段读取法线、标量、深度与标记 |
| 辅助输出 | 写颜色与法线,并接回公共运动 |
| 后续合成 | 根据可见性和类别,叠加辅助颜色 |
它说明屏幕数据并非只能交给最后的像素效果。前面栅格化得到的表面信息,可以被后面的几何处理再次读取。
辅助颜色有独立的深度测试和分类条件,采用预乘式颜色合成,并只更新 RGB。写入范围、深度是否更新和哪些分量保留,需要与辅助程序一起理解。
当前尚未可靠确认这条路径对应的具体部位,因此本篇不将其直接命名为头发或脸部专用算法。可以确认的是反馈关系与合成接口,而不是未得到验证的业务归属。
植被轮廓与双面方向
树冠与竹叶的外观需要把颜色、覆盖和方向解码放在一起理解。资源表已按颜色图自身 alpha 显示轮廓:灰色背景处没有对应的可见叶片颜色,原始 RGB 在这些位置仍可能有填充值。
叶缘先进入深度,颜色复用同一覆盖
已核对的树冠前置程序读取颜色图 alpha,并与一个随观察方向调整的阈值比较;低于阈值的片元被丢弃。几何面片因此只在叶簇轮廓内建立深度。后面的树冠颜色路径使用相等深度测试、关闭深度写入,复用已经建立的覆盖。
这是剪裁得到的叶缘。预览把颜色图按 alpha 显示,只用于让读者看到对应图案;它不是把深度剪裁改成整张面片的透明混合,也不代表每个半透明预览像素最终保留相同比例。
方向图 RG 需要按该材质的编码恢复
树冠代表颜色程序读取另一张数值图。其 RG 并不是直接把
上式描述编码的有效范围。随后调整方向强度、归一化,再用模型的切线、切线副方向与几何法线转到世界空间。相同一张 RG 纹理若按另一种常见法线格式读取,会得到不同方向,进而改变叶片上的明暗和反射。
背面方向与材质控制分开处理
程序根据材质/顶点条件决定是否启用双面调整。启用时,正反面符号参与局部方向的横向分量变换,也参与世界方向的最后处理,使背面不能简单沿用正面朝向。这个条件来自实际材质与几何输入,并不等于整片竹林都使用一个固定的双面开关。
同张数值图的 B、A 还参与材质响应、局部遮蔽及分类相关控制;颜色纹理的 alpha 则服务前置轮廓。这是两张纹理里的不同 alpha,不能把它们统一称为叶片透明度。细竹叶与低面数树冠采用不同几何和变体,资源规模与当前状态仍需按各自提交理解。
竹林表面的方向性环境受光
竹林表面会因所在位置与朝向不同而接收不同环境光。当前路径从三层空间数据中选择覆盖范围,恢复一阶方向系数,再与着色方向组合;本节沿一个表面查询完整走过这条链。
同样的网格数,覆盖不同的世界范围
每层有 128×64×128 个空间位置,步长分别为 0.5、2 和 8:
| 层次 | 每格步长 | 完整覆盖尺寸 |
|---|---|---|
| 近层 | 0.5 | 64×32×64 世界单位 |
| 中层 | 2 | 256×128×256 世界单位 |
| 远层 | 8 | 1024×512×1024 世界单位 |
世界单位没有换算为米。覆盖中心还受参考位置与偏移控制,这不是三个永远固定在原点的盒子。
采样坐标包含周期寻址:
边界同时检查水平与竖直范围
当前近层的水平、竖直淡出起点约为 29 和 13,过渡宽度为 2;中层为 116、52 和 8;远层为 464、208 和 32。
近层淡出量为
其余影响继续交给更远层。边界判断使用水平最大距离与竖直距离,不能用简单球形距离完整替代。
幅度与三段系数组成方向光照
每层由两张体积配合:一张保存 HDR 基础幅度,另一张沿高度分成三段,分别保存红、绿、蓝的方向系数,所以后者高度恰好是前者的三倍。
这张图是系数编码,三个高度区域对应三种颜色的方向信息,不是三张场景照片。对每种颜色,幅度
各段的纵向坐标还限制在半纹素边界内,防止线性过滤跨入另一颜色的系数区。层间混合后继续加入低频环境项,并由按亮度加权的方向信息求一个环境主方向,供材质控制。
本帧读取的是已存在体积,没有观察到完整生产过程。已确认布局、解码、过渡与消费,不能据此判断它们全部离线生成还是持续动态更新。
从一个着色点走完空间光照查询
数据布局示意,外框不按世界尺寸比例绘制。体积切片的实际图像见前图;这里说明它们如何组成一个方向函数。
设着色点落在近层向中层的过渡区,并得到近层淡出
每层的读取可拆成以下操作:
- 世界位置转换到该层的参考空间,再按该层网格尺度生成循环坐标。
- 从 128×64×128 的幅度体积取得三个颜色幅度。
- 对红、绿、蓝分别去对应的系数段读取三维方向向量。
- 将系数从归一化存储恢复成带正负号的方向项。
- 按覆盖权重组合相应系数与低频环境项,再结合材质着色方向求值。
三个系数段共享同一份空间布局。设段内纵坐标为
方向项也可以通过简单算例认识。假设某一颜色的幅度
系数提供的是低阶方向变化,无法单独表达任意尖锐的镜面反射。角色的高光、主光明暗和环境方向可以共同影响最终材质,不能把这份方向场当成整套反射模型。
物体与空气中的光源遮挡
光源方向的遮挡既改变表面的直接受光,也影响空气里可积累的散射光。本节说明同一阴影图集怎样服务这两类消费者,体积中的具体累积放在雾效果中展开。
场景阴影按光源视图组织到图集中。主照明利用它判断物体是否收到光,雾的局部体积更新也读取它,控制空间中的散射光是否被遮挡。
同一遮挡关系因此影响两件事:石面受到多少直接光,以及相机前方空气里能积累多少光。只在最终表面颜色上乘阴影,无法替代雾生成时的阴影查询。
辅助几何也有独立深度,但其生产者和消费者与主阴影不同。不能因为一张图只保存深度,就把它归为光源阴影。
目前确认的是图集查询和多处消费。区块如何长期分配、哪些光源分帧更新,仍需跨帧材料。
接触暗部与环境遮蔽
石面、竹林与人物周围的邻近遮挡需要由当前深度和方向判断。当前实现沿多个方向搜索遮挡边界,再用历史和保边过滤稳定结果;本节从可见输出进入搜索、积分与过滤的细节。
深色带帮助定位遮蔽作用区域。最终暗部还包含材质与直接阴影,因此两图不能作亮度差来量化 AO 的独立贡献。
AO 近似描述附近几何对环境方向的遮挡。当前路径从可见深度搜索局部地平线,再稳定和过滤结果。
三个方向、三个距离与正负两侧
每像素构造三个方向,方向间隔约为
距离含有扰动与幂函数分布。采样半径变大时,根据其对数选择较粗深度层级;不是所有查询都读取完整分辨率。
深度恢复为观察空间位置后,程序计算相对投影法线的上下遮挡边界,再组合成当前遮蔽。这些运算支持地平线式屏幕遮蔽的解释,但不能单独确认某个实现库版本。
搜索半径先从空间尺寸转换成像素尺寸
AO
希望搜索一个有空间意义的邻域,但实际查询发生在屏幕深度上。程序先重建当前观察空间位置
所以同样的空间半径,在较近表面上可能占更多像素;超过 48 像素后则被限制。这里的上限来自本次程序,不能直接理解为世界中 48 个单位。限制半径后,程序也重新计算实际覆盖的空间距离,后面的距离衰减采用这份有效范围。
三个方向使用每像素扰动
每方向三个距离的排列可整理为:
扰动也不是每次临时生成一个完全独立的随机数:程序对屏幕坐标位作排列,再与一个取模 64 的时间参数组合,得到两维小数扰动。这里能确认的是空间与时间都进入采样序列,不把这段生成方式未经验证地命名为某张蓝噪声纹理。
地平线搜索记录的是角度边界
采样与处理流程示意,点位仅说明三个方向、三个步长和正负两侧;实际位置包含扰动和距离重分布。
对当前搜索方向,程序以视线和屏幕方向张成一个切片平面,将表面法线投影到这个平面。投影长度表示原法线与该切片的关系,投影方向则给出切片中的法线角度。
每个深度样本恢复为观察空间点
距离衰减还会单独缩放相对位移的深度分量,然后才计算长度。这使视线方向上的大深度落差可以被额外削弱,降低屏幕可见薄片被错误解释为厚实遮挡物的影响。该控制项不是再次缩放最终 AO,而是在决定哪些样本足以推进地平线时发挥作用。
从两侧角度积分到最终标量
两侧候选经近似反三角函数变成边界角
这份语义整理保留两侧积分、法线角和投影长度的关系。原程序用近似反三角计算角度,并没有逐方向调用一套任意精度的解析积分;公式也不代表可以不顾浮点顺序替换原指令。
三个方向的和还包括小搜索半径时的补偿项,取平均后进行幂变换、最小值限制,再乘约 0.6667 并写入归一化目标。因而前面实际遮蔽图用 0~0.67 显示,是为了匹配这份输出的尺度,不能看到“最亮不到一”就认定所有区域都被额外遮挡了三分之一。
同时生成相邻表面的连续程度
邻域深度差形成边界判断,包含:
结果按四个方向量化打包。深度不连续处限制跨边界混合,避免将前景遮蔽带到后方表面。
遮蔽图表示“暗多少”,边界图表示“过滤能否跨过去”。两份数据承担不同任务。
历史保存遮蔽、深度和权重
| 历史分量 | 写入内容 |
|---|---|
| 第一分量 | 稳定后的遮蔽 |
| 第二分量 | 缩放截断后的深度标量 |
| 第三分量 | 本次采用的历史权重 |
| 第四分量 | 当前为零的占位 |
深度标量是
当前遮蔽
运动在半分辨率像素空间中计算。移动越大,旧对应关系越不可靠;深度变化越大,越可能换成另一表面。旧遮蔽还被限制到当前邻域范围,避免过时暗带跨过新边界。
超出屏幕时权重归零;功能关闭时直接输出当前遮蔽,本次路径开启。即使静止且深度一致,基础混合仍保留约 3% 当前结果。
边界两侧都允许,才充分混合
每方向边界量保存为四档。读取后恢复到零到一,再让中心方向值与邻居反方向值相乘:双方都认为可以跨过时,混合才充分发生。
过滤还包括对角组合权重与中心权重,最终按总权重归一化。当前中心项为
每个 8×8 工作组中,一线程处理水平相邻两个像素,形成 16×8 输出区域。随后再做一轮保边处理,最后读取中心与四个对角位置上采样。
两图均以 0 到 0.67 预览。原始结果包含较细碎的变化,后图经过多步稳定和过滤;两者之间不只差一次模糊。
最后五点上采样没有再次读取深度。主要深度约束已在历史和边界过滤中完成,不能把每一步都统称为深度双边过滤。
保边量的打包与双向检查
四方向连续程度先乘约 2.9 并舍入到 0~3,再各占 2 位放入同一字节。恢复时分别提取四个字段并除以三。因此它只提供四档边界许可,不是高精度深度,也不是四个方向的 AO。
对于水平相邻像素
若中心认为右侧连续程度为 1,而右邻居认为左侧为
0,乘积仍为零;若分别是
对角贡献还组合了相邻连接并带有约 0.425 的系数;加上中心项和各方向项后统一除以权重和。这个归一化很关键:同样数值的平坦区域,即使因为边界丢掉某些邻居,也应维持原有标量,而不是因邻居减少而自动变暗。
历史阶段与空间阶段的限制也各有作用。历史深度差让错误的旧表面失去权重,3×3 范围限制过时的遮蔽值,边界量则约束当前画面里邻居之间能否混合。最后五点上采样没有重做这些判定,不能把它当成具有独立几何理解能力的滤波器。
临时数据与历史的数据寿命不同
原始遮蔽、过滤结果和边界数据属于当前帧临时结果,其中部分存储后面会被反射改作其他用途。跨帧历史则必须保留到下一次使用。
同一纹理顺序改写说明用途复用,不等于已经确认两个不同资源共享同一底层显存分配。
表面反射与历史颜色取样
竹林地面局部能够反射人物和周围颜色。本帧把这项效果拆成屏幕查询与环境探针两路:前者利用当前可见深度找到反射位置,再从旧 HDR 读取颜色;后者按空间范围与反射方向读取已保存的环境。最后按经过过滤的有效权重混合,继续乘材质的镜面响应。
两图来自同一截帧、同一最终颜色阶段和同一裁切范围。左图保留原流程,右图只将屏幕反射的最终混合权重置零,保留环境探针及其余阶段。可观察后方红色角色下方地面的红色倒影和浅色反光变化;这项对照并未关闭人物直接高光或环境照明。
对照前还执行了使用原程序的替换回放:原程序与基准在全分辨率显示 RGB 上仅有极少量量化差异,屏幕反射关闭后的变化则明显集中在地面。它验证的是当前截帧的贡献,不用于推导连续运动中的稳定性。
哪些表面值得发起屏幕查询
准备阶段在 1720×720 的半分辨率上读取深度、法线及材质参数。法线先按八面体编码解开;两份表面方向的选择还受到恢复位置之间的距离控制,环境相关的表面调节继续改变用于反射的方向与粗糙程度。因此后面的反射并非只拿一张未经处理的法线图求镜像方向。
将这条路径最终使用的粗糙度控制记为
粗糙表面逐渐退出查询;视角项倾向保留掠射方向;对非极光滑表面,距离项还会减少远处查询。这里的距离按截帧使用的空间单位表达。具有特定表面标记的像素,还会比较两份深度对应的前后关系,不满足条件时把权重归零。
这份权重随后以单通道八位格式保存。它用于判断当前是否值得查询,既不是实际反射亮度,也不是已经找到命中的证明。
按屏幕块分配两种采样预算
每个 8×8 半分辨率块先汇总像素分类。有效权重达到阈值后,
| 当前块类别 | 本帧块数 | 实际处理 |
|---|---|---|
| 含高采样像素 | 2,112 | 高类别像素使用 128 个候选采样;同块其他有效像素仍可使用较低预算 |
| 仅需较低预算 | 13,488 | 当前候选采样数为 16,即高预算的八分之一 |
| 无有效查询 | 3,750 | 写入默认坐标、零有效权重及所需控制,不做同样的深度搜索 |
三类合计 19,350 块,正好覆盖
沿反射方向寻找深度相交位置
程序由当前深度恢复视空间位置
它将这条方向投影到屏幕,按屏幕边界限制搜索线段,再依据当前预算得到屏幕坐标和投影深度的每步增量。起始位置加入与像素和帧状态有关的扰动;若一个步长投影后不足一个像素,还会调整起始偏移,减少反复查询起点附近。
当前两个查询程序都以四个连续候选为一组读取深度。它们在搜索期间读取所绑定深度层级的第零级;后面的粗糙反射过滤才显式查询不同层级。因此不能仅凭“绑定了深度金字塔”就把这里写成逐级下降的 Hi-Z 遍历。
记候选射线的投影深度与已见表面深度之差为
才进入命中处理。四个候选中优先选择最早满足条件的一个,并用前后深度差作一次受限插值:
得到更细的屏幕落点。这是有限采样与厚度容差下的近似相交;深度只记录当前视图可见表面,遮挡背后的几何不会因此自动变得可查询。
找到当前落点以后,还要验证旧帧对应
命中位置越靠近屏幕边缘,权重越低。本帧以 UV 到最近边缘的距离
接下来读取命中表面的运动,把当前落点移回旧帧位置。运动按本篇后文所述的四次方关系解码。历史深度可用、且当前历史校验分支启用时,程序分别恢复当前命中点与旧点的位置,检查:
超过阈值就取消本次有效权重。本帧运动重投影和这条深度校验均启用;阈值随深度增大,不能解释成全场景固定的 0.25 距离。
若搜索没有命中,程序写回当前像素自身的默认坐标,并将当前有效权重设为零。默认坐标方便后续按统一接口读写;它不表示允许把当前位置的颜色直接当作反射。 是否采用屏幕颜色,还要由独立权重以及后面的历史过滤决定。
命中坐标、反射颜色与有效权重分别保存
查询结果包含三种用途不同的数据:旧画面中的二维坐标、当前有效权重,以及用于历史响应和粗糙度过滤的控制。两张二维坐标/控制图使用双通道十六位归一化存储,当前有效权重使用单通道八位存储。
颜色读取阶段再恢复到主视图尺寸。记全分辨率像素坐标为
同一个半分辨率位置对应四个全分辨率像素,余数项保留四者的子像素差异。它没有为每个全分辨率像素重新执行一遍完整查询。
极亮颜色先压缩,再参与过滤
旧 HDR 取色后,先按最大分量压缩:
极亮样本各通道按同一个分母缩小,减轻它在过滤中的支配程度。这里是可逆的中间计算域,过滤结束后还会按
颜色与有效权重随后分别进行历史过滤。权重使用标量邻域,颜色则转到
YCoCg 亮度/色差空间;两者都读取当前 3×3
邻域,结合轴向及对角范围、均值和
颜色的历史裁剪沿“区间中心到旧颜色”的方向缩回允许盒内,保持分量间的对应。两条历史路径的混合权重均为
左图是当前深度查询和对应校验之后的有效权重;右图是历史及尺度处理之后,交给场景照明的混合权重。均为真实单通道结果,按零到一显示。本次前者约 11.7% 的像素非零,后者约 18.7% 非零:历史与邻域处理改变了分布,后者不能当作当前搜索的命中率,更不能当作最终画面中反射可见面积的百分比。
粗糙表面怎样得到更宽的反射
查询程序还根据粗糙程度估算反射的屏幕足迹。其中角宽关系为:
它结合查询距离、观察方向与表面切向,将两个方向的展开投影回屏幕,再由足迹估计对数过滤层级,当前限制在零到六。极光滑的分支直接使用较细结果;粗糙表面则从颜色层级取得更宽的平均。
合成时,在相邻两个整数层级上各读取一组 4×4 颜色样本。空间核为
分别归一化两层结果,再按层级的小数部分插值,最后恢复 HDR。深度差限制不同距离表面随意混在一起,但它并不能补出视图之外缺失的几何。
未命中和低权重区域由环境探针补足
场景照明先计算一份独立的环境反射。当前输入是一张 576×576、32 层、10 级 mip 的二维纹理数组:反射方向经过八面体展开后定位到二维坐标,数组层选择不同环境记录。32 是资源容量,不能直接当作本视角同时贡献的探针数。
局部探针按屏幕分区与深度分区的位集合交集筛选,再检查着色位置是否位于各自的空间范围。记录可以给出盒内方向修正开关、边界淡出与亮度调整。开启盒内修正时,程序把反射方向变换到局部空间,求射线与盒边界的交点,再由修正方向查询环境;未开启时沿原反射方向查询。该分支按每条记录分别判断。
多个记录按剩余权重依次组合:
剩余量仍大于 0.01 时,再由默认环境层补足。这里既有空间筛选也有剩余权重,不能把它写成所有探针颜色无条件相加。
最后,用前面得到的屏幕反射颜色
当前屏幕反射合成开关开启。
需要继续区分的是:本节已确认当前场景路径的筛选、搜索、校验、历史过滤和探针补足;它没有验证所有其他材质变体,也没有证明单帧回放能反映快速运动时的全部更新行为。
雾的散射、透射与空间层次
空气一方面增加散射光,另一方面削弱来自表面的原有颜色。当前实现先生成局部介质,再按深度顺序累积两种量,最后让场景与角色共同读取;深度切片图用于分别观察这两个作用。
局部体积描述某一小段空气,累积体积描述相机到某个深度之间的整段空气。两者在数据流中前后相接,却不能互换。
每个空间位置先得到散射与消光
局部生成阶段读取空间位置、灯光、阴影与相关介质参数,输出散射源
空间中的各点可以独立求值,但沿一条视线的累积不能完全独立:远处一段空气收到的贡献,要乘上近处已经消耗后剩余的透射率。
按深度层顺序积分
程序通过投影关系恢复每层位置,计算相邻层之间的距离
距离淡入权重由沿途距离与当前参数形成:
在有效的正消光范围内,主要累积可整理为:
原指令的分母表达中包含
每个线程沿一列依次积分,而不是每层单独完成
视线积分示意。距离和数值均为公式算例;截帧中的真实近远层显示在下一组图片中。
本次积分分派采用 8×8×1 的工作组。一个线程固定体积的横纵位置,循环处理所有深度层,在线程内部保留累积散射、累积透射、已行进距离和上一层空间位置。横纵不同列可以并行,单列中的远层则依赖近层结果。
深度层不是简单等距切片。程序先对层序号作指数映射,再经当前投影参数与逆变换恢复位置,最后计算两个实际位置的欧氏距离
按当前正消光路径,循环可整理为:
1 | L = 0,T = 1,累计距离 = 0 |
初始化的
用两段相同空气举例,令
若简单把两段散射相加,会得到约 0.7870,遗漏了近处空气对远处散射的衰减。若只保留透射,又会遗漏空气自己散射进来的光。这就是为什么累积纹理必须同时保存 RGB 和透射分量。
距离淡入
同一体积里的近层与远层有什么差别
两张从同一累积体积取较近和较远切片,采用相同的 0 到 0.05 预览范围。远层出现更明显的空间分布;预览达到白色只表示超出此显示标尺,不代表实际数据在这里截断。
这里单独显示 alpha 中的透射率。较亮表示保留较多表面光,较暗表示经过更多衰减。切片来自深度层序列,不按等距离的米数解释。
这组图把“空气加进多少光”和“空气让原有光剩多少”分开显示。单独展示最终雾色,很容易遗漏第二个量。
场景与角色都消费累积结果
表面已经得到自身颜色后,合成为:
角色路径也读取这份累积体积,并与其他高度雾相关项组合。人物与背景因而共享同一视线上的空气条件,同时仍保留各自的材质计算。
局部更新需要先读取旧体积,积分才覆盖新结果。数据更新顺序本身就是效果正确性的条件,不能把累积体积当作每个步骤都可以随意清空的临时颜色。
屏幕径向光束:本帧执行,但输出为零
空气层次之外,本帧还执行一条屏幕光束链。它先从场景颜色提取超过阈值的亮部,乘深度、画面边缘和光源中心附近的空间权重,再连续进行径向平均。颜色提取的亮度阈值为 0.62,当前径向程序每次使用 12 个样本。
将屏幕像素记为
而本帧中心约为
人物形变与表面方向
人物姿态改变时,几何位置、法线和切线必须保持一致。当前身体路径先解码压缩方向,再混合骨骼变换,同时保留前后时刻的位置供画面稳定使用。
这条身体顶点程序与此前完成语义还原的对应程序具有完全相同的原始反汇编,因此可以继续解释此前尚未命名的输入。以下计算按竹林这次绑定说明;其他捕获的相机、材质和姿态常量不参与本篇取值。
一个 32 位字可同时保存法线、切线方向和手性
位置后的一个 32 位存储槽,在压缩路径中按整数位解释:
| 位段 | 含义 |
|---|---|
| 低 10 位 | 法线投影的第一个坐标 |
| 接下来的 10 位 | 法线投影的第二个坐标 |
| 再后面的 10 位 | 切线绕法线的方向参数 |
| 倒数第二位 | 是否采用压缩切线基 |
| 最高位 | 切线手性,恢复为负一或正一 |
前两段从无符号码恢复为带符号值,再乘约
第三段也先恢复为带符号归一化参数。程序用法线分量的循环差构造种子方向,得到与法线关联的参考基;再以该参数构造二维方向并归一化,在参考基中恢复切线。最高位决定副切线应采用哪一种手性。
这解释了输入布局里看似只有一个浮点分量的槽位:它可以承载完整的位编码数据。把这个浮点数的数值直接当成法线 X,会失去其中三组字段。
骨骼行先混合,再同时变换位置与方向
实体记录中的标记决定是否蒙皮,以及采用一、二或四个骨骼影响。每个骨骼以三行四分量向量保存仿射变换,当前和旧骨骼各有基址。
对于二或四影响,先按权重混合矩阵行:
法线和切线使用相同行的前三个分量参与变换,不带位置的平移项。四影响分支按前两个、后两个组成两组后再相加;单影响分支直接读取相应骨骼行。归一化的输入权重参与运算,程序不会在这里再把它们除以权重和。
当前位置和旧位置各自使用对应的骨骼行,因此人物自己摆动的位移可以被保留下来。未启用蒙皮的分支则保留当前输入位置,并从备用输入取得旧位置;另一个实体控制还允许用当前蒙皮位置代替旧蒙皮位置,但仍保留旧物体和旧相机变换。
角色的表面色、明暗与高光
角色先建立材质与可见表面,之后再通过专用几何着色补入颜色。下面用阶段对照定位这一步,再依次展开材质分类、身体方向、脸部视角色调和最终受光;环境光与雾由前面的场景效果提供。
阶段对照:角色颜色何时接入场景
全景对照使用相同 HDR 标尺。前一阶段人物区域仍有黑色轮廓,后续几何补入角色颜色;背景主要结构保持对应。
前两张统一采用 0 到 0.2 的 HDR 预览;第三张已经过后续整帧显示处理。它们证明的是阶段贡献,未单独隔离环境光、阴影或雾的增益。
深度相等让着色落在已有表面上
前面的深度和材质阶段已经建立人物可见性。代表后续路径使用相等深度测试,在匹配已有表面的位置输出颜色与运动。
黑色人物区域因此不意味着此前没有几何。更准确的解释是:人物的表面位置已经存在,专用颜色等到适当阶段再计算。它能够直接利用前面已经准备好的空间光照、阴影与雾。
这一阶段共有多次几何绘制,包含已确认会补入人物颜色的路径;不能因为连续的一组绘制都写同一目标,就把组内所有匿名程序都认定成同一种角色部件。
材质准备:身体方向、脸部色调与分类
人物主材质在照明之前保存后续所需的数据。下面三项分别解释分类标记、表面方向与脸部基础颜色。
代表人物的材质目标还保存一个完整的整数标记字
中央身体和脸部的主材质程序从实体记录取得一个 32 位整数,按 RGB10A2 的位宽拆为四部分:
这里四个归一化值用于让渲染目标按 10、10、10、2 位保存原来的字段。该人物分支中,这个目标并不是四个独立连续的物理材质参数。恢复后还需要按后续消费者的位域规则解释;也不能将这套布局推广到所有场景表面。
这和运动目标里的类别量不同。运动目标另写 RG
位移、B=1、A=0.4;最后一项经过两位 alpha 量化后读回为
身体法线从材质纹理恢复,再进入屏幕法线编码
身体材质先取法线纹理的
然后才对 XY 乘法线强度,变换到世界切线基。本次使用 BC5,未存储的 alpha 按默认分量取值,强度为一。这个顺序说明材质强度并未重新计算 Z;它在已有方向上调整横向幅度,再通过归一化恢复单位长度。
背面会乘
屏幕编码采用世界方向的 X、Z 作二维坐标,以 Y 区分上下半球:
当
脸部在材质颜色阶段已经加入一项视角色调
脸部主材质并非只复制底色。它先由表面到相机的方向
本次
这项输入依赖观察方向,不查询光源深度,应该与真正的阴影采样分别理解。它能够解释材质图里某些脸部明暗,而不能被当作该帧实时自阴影的证明。
这条脸部路径和身体一样向 HDR 目标写零,向材质颜色写处理后的 RGB 与 alpha=1;脸部还向法线目标 alpha 写 0.4,身体的对应分量写零。后面的分类与照明通过这些不同字段继续选择处理方式。
脸部受光:漫反射、高光与受控明暗方向
下面展开与前文中央人物脸部对应的后续着色程序。它的一次提交为 3530 个三角形,结论限定于这条已追踪路径。
金属混合量同时影响两种颜色
表面基础颜色为
漫反射颜色
高光宽度相关量为:
其中
以上针对已经展开的代表程序。其他变体是否使用相同通道约定,需要分别确认。
主光与材质方向共同决定分区
程序将主光方向压向水平面,加入较小竖直分量后归一化。局部光向决定控制纹理的横向采样是否镜像。
控制纹理的一个分量
这个平面方向经过相应变换后,与几何法线插值,再归一化,形成着色方向。它允许作者在材质中控制受光走势,而不要求完全依赖网格曲率。
同一采样的两个分量取平均,与光向产生的阈值做平滑比较。边界参数限制在 0.001 到 0.999 内,再将得到的控制映射到渐变纹理横坐标,以固定中间行读取颜色。
由此形成的明暗同时包含几何方向、贴图设计和渐变。普通的
环境光使用的是同一套着色方向
三层环境数据解码后,每个颜色得到一个常量项和三个方向系数,与
场景提供位置相关的光照系数,角色提供经过材质调整的方向,两者在这里相接。环境光不是对角色无差别乘一个固定 RGB,也不是一定等于全屏照明此前算出的颜色。
随后,当前角色颜色接受累积雾和其他空气项的合成。几何运动仍独立写入,并不因为颜色被雾衰减就一起变成“雾的运动”。
晚期受光面片与柔和交界
主体人物和场景之后,还有读取烟雾状图集的效果面片。下面选取当前角色头部附近的一次代表提交,说明纹理、深度交界、受光、颜色混合与运动目标分别承担什么任务。
左图黄色线框定位实际面片,右图是该材质读取的 512×512 烟雾状图集,均来自截帧。该提交只有 44 个三角形。它在当前姿态下的单次可见贡献很弱,所取局部阶段预览没有明显前后差别,因此本节使用几何和输入图定位算法,不将其描述为这幅画面中强烈的烟雾效果。
图集颜色、覆盖量与分支开关
代表程序用传入 UV 读取图集,将纹理与顶点颜色、材质乘色组合。本帧颜色倍率为 1.5、覆盖倍率为 0.3;另有高于阈值的亮度增强和曝光响应。图集中的局部图案为面片提供细节,实际可见范围还需要后面的空间及覆盖条件共同决定。
| 当前控制 | 本帧状态 | 作用 |
|---|---|---|
| 深度交界淡出 | 启用,宽度参数 8、偏移 0 | 面片接近已有表面时逐渐降低覆盖量 |
| 近远距离淡出 | 启用 | 近处从 0.001 到 1 逐渐出现,远处从 100 到 120 逐渐消失 |
| 受光方向覆盖 | 启用 | 使用向上的方向参与受光,而不是逐片沿几何法线形成明暗 |
| 溶解分支 | 关闭 | 当前不把图案边缘解释为正在发生的溶解 |
| 位移写入 | 当前分支关闭 | 通过目标混合保留已有运动,不生成这次提交的独立位移 |
距离和交界宽度均沿用截帧的空间单位,不额外假定它们就是米。
深度差让面片与实体表面柔和连接
程序读取已有场景深度并恢复位置,与当前面片的视空间深度比较。将两者记为
它再乘纹理覆盖、距离淡出及实例控制。面片紧贴实体表面时覆盖趋近零,距离拉开以后逐渐保留原覆盖。这比单靠深度测试的通过/失败多了一段过渡,用来减轻效果面片与石头、人物等相交时的硬切边。
本帧距离项可整理为:
这两项都作用于当前覆盖量。它们没有改变后方物体的深度,也不等同于场景体积雾沿视线进行的透射积分。
效果颜色也会查询灯光与环境
代表程序把方向覆盖为
因此,这组面片并非只把一张白色烟雾图以固定亮度贴上去。纹理颜色、材质倍率、主光、局部光和环境系数共同形成未合成颜色,随后仍接入本场景的雾透射与材质颜色控制。
内部覆盖量与输出 alpha 不必相同
这次颜色目标使用源因子一、目标因子一减源 alpha。程序先以内部覆盖量调节 RGB,但本帧模式又把送往混合器的 alpha 设为零。因此这次组合表现为:
效果有覆盖控制,同时采用加色合成。仅看到最终 alpha 为零就认为“该提交没有颜色贡献”,或把它当成普通遮挡背景的透明面片,都会漏掉程序内部的预乘与模式选择。
另一个目标保存运动及效果控制,混合因子采用源颜色和一减源颜色。对其任一分量,混合形式为:
当前位移分支输出零时,对应分量保留旧运动;其他控制分量仍能按覆盖后的亮度标记效果区域,供后面的历史处理使用。颜色、内部覆盖、输出 alpha 与历史标记在这里是不同的数据,不能用一个“透明度”概括。
抗锯齿与画面稳定
画面稳定首先要求历史颜色对应同一表面。当前实现分别表达采样抖动与物体运动,再通过深度、运动和分类验证历史,约束旧颜色并回写置信状态;它与 AO 自己的历史属于不同数据链。
相机抖动只进入光栅位置,不直接进入运动差
当前蒙皮位置经过当前物体变换,并减去当前世界参考原点;旧位置使用旧物体变换和旧参考原点。两者随后分别投影。
设未抖动的当前裁剪坐标为
但传给运动计算的仍是未加入这项的当前
这条链补足了“运动来自前后位置”的具体含义:前后位置不仅包含相机矩阵,还包含姿态、物体变换、参考原点,以及一个可控制的旧位置选择。
表面对应:运动编码与分类量化
当前与旧的投影位置除以齐次分量后,得到归一化设备坐标。程序转为纹理位移:
随后用两次平方根压缩小位移:
读取时执行对应的四次方:
它使很小的屏幕运动在有限存储位宽下拥有更多表达空间。直接将编码值当作线性速度,会让重投影位置出错。
量化后的类别才是实际读回值
代表角色程序向附加通道写入一个 0.4 的控制量,但目标 alpha
只有两位,因此实际可存值只有
后面程序按接近 0.3 的区间判断相关类别,匹配的正是量化后的值。若只阅读写入常量,期待消费者精确读到 0.4,就会误解这个分支。
这也是为什么格式和通道含义必须一起说明。格式并非附带的资源列表,它直接影响算法条件。
历史颜色:有效性检查、重建与融合
在角色、透明与效果完成当前颜色和运动之后,整帧处理才能比较新旧表面。它读取的不仅是旧 HDR,还有旧深度与旧运动、类别信息。
第一步:逐像素检查对应关系
预处理比较当前与历史的深度、运动和分类。它输出一份邻域深度,以及同时保存运动和变化标志的数据。
深度用于发现遮挡显露或表面变化,运动差用于判断前后对应是否稳定,类别变化则防止不同处理规则之间随意继承旧状态。只比较颜色相似度,不能完整替代这些判断。
第二步:在较低分辨率汇总变化
汇总阶段读取中心与四个对角位置,将变化标志组织成 860×360 的单通道结果,再供颜色融合使用。
黑白区域是后续控制条件的分布,不是已经发生拖影的位置,也不是最终颜色误差图。它帮助观察历史控制如何覆盖人物、前景与背景边界。
低分辨率汇总使邻域的变化能够影响对应区域的历史使用,而不是只保留一个孤立像素的判断。
第三步:融合 HDR 并回写置信状态
颜色阶段读取当前 HDR、重投影后的旧颜色和前面形成的有效性信息,输出新 HDR 与置信状态。它和 AO 的历史是两套数据:一个稳定局部遮蔽,另一个稳定整幅照明颜色。
旧颜色还被反射读取,因此必须在两个消费者结束后才交换历史版本。颜色、深度、运动和分类也需要保持时间对应;只有颜色更新、其他数据停留在不同时间,会破坏验证。
下面继续展开本次颜色融合程序中可以直接核对的重建、统计与状态计算;控制位仍按已经确认的行为描述。
历史重建先压缩亮度,再恢复并限制过冲
按本帧三阶段依赖与颜色融合程序绘制。图中的置信状态是此路径的反馈量,不是概率或最终画质评分。
历史颜色采用五次过滤采样组成十字形三次重建。每个样本
在压缩域按三次权重累加并归一化后,再用相应反变换恢复
HDR。程序随后在旧坐标额外取得一次普通过滤样本
这道限制处理的是三次重建可能产生的过冲,依据来自同一位置的历史图;接下来的当前邻域统计,则处理历史与当前画面不一致。二者处于不同颜色阶段,不能省掉其中一个后仍声称保留了原来的历史约束。
当前 3×3 邻域在 YCoCg 中形成允许范围
当前颜色先取非负部分,再转成以下尺度的亮度与色差分量:
对九个当前样本分别计算均值和标准差:
这些运算按三个分量分别进行,原程序使用约 0.1111 的系数。区间最后扩展到包含当前中心值,避免中心本身因为邻域差异而被排除。普通路径把历史 YCoCg 夹入该区间。
20 与 40 是上述 HDR
色差空间中的数值阈值,不是像素距离,也不能用于缩小四倍后的另一种 YCoCg
编码。随着标准差增大,
置信状态同时依赖当前结构与旧状态
程序还判断当前中心与八邻居的亮度关系,形成邻域结构候选状态
当
最终混合仍在归一化的亮度/色差空间
记选定的当前 YCoCg 为
之后由:
恢复 RGB,限制为非负,并将
亮部泛光与多尺度光晕
泛光让高亮区域向周围扩散,同时保留亮部核心。当前路径按软阈值提取亮部,用不同尺度覆盖不同扩散范围,再把每层细节与较粗光晕逐层组合。
泛光位于 HDR 历史融合之后。它先挑选亮部,再建立多个空间尺度,最后逐层合成。这条路径同时决定亮点周围扩散多远,以及核心细节保留多少。
前两张都用 0 到 0.02 的 HDR 标尺,便于观察弱扩散。第三张是最终外观参照,包含本体颜色与其他合成,不能据它单独反推泛光强度。
高亮提取有柔和过渡
有效输入颜色为
提取色为
在进入提取前,程序还按数值表示筛除负值与非有限值,防止异常样本在后续层级中扩散。
极亮孤立样本会降低自身过滤权重
对提取色
预过滤把空间权重与该项相乘,累加加权颜色,再除以总权重。越极端的亮点,越不容易单独支配整个邻域。
当前预过滤共使用 13 条采样记录,包括中心、较远四角、轴向点及内侧点。已保存的程序中,内侧记录有一个偏移重复;本文按实际记录理解它,不擅自替换成常见的完全对称模板。该细节是否属于源程序设计,需要进一步材料确认。
下降链覆盖越来越宽的空间尺度
当前亮部从半分辨率开始,依次下降:
1 | 1720×720 → 860×360 → 430×180 → 215×90 |
越低分辨率的一次邻域过滤,对应原画面中越宽的范围。细层保留集中亮部,粗层形成大范围光晕。
这些不是可以生成下一层就全部丢弃的中间图:上升阶段还需要每一层原先的下降结果,才能将局部细节与较粗光晕重新组合。
九点可分离过滤怎样复用数据
下降过滤的一维核有九个位置:
| 与中心距离 | 每侧的近似权重 |
|---|---|
| 0 | 中心 0.2734 |
| 1 | 0.2188 |
| 2 | 0.1094 |
| 3 | 0.0313 |
| 4 | 0.0039 |
程序先完成一个方向,再做另一个方向,形成二维效果。其实际实现由 8×8 线程组协作:颜色分量进入组共享数组,部分数据以成对半精度形式打包;同步后完成第一轴,再将中间结果写回共享内存,供第二轴使用。
因此,两个方向并不必然对应两次独立的全图显存往返。只看滤波数学形式而忽略线程协作,会漏掉这条实现的重要部分。
上升重建保留每层自己的亮部
对较粗图的采样位置,程序按小数坐标构造三次 B-spline 权重。每轴四个一维权重配对为两个双线性采样位置,二维组合只需四次双线性采样。
得到较粗层重建色后,与本层保留的下降结果混合:
0.41 是当前代表路径的参数,不推广为所有画质或所有变体的固定值。它具体说明了为什么不能只放大最小那张图:本层细节还在参与最终结果。
四次双线性采样如何表达二维三次 B-spline
层级与重建示意,仅画出代表层;真实下降尺寸列在上文。两个方向的权重配对来自当前上升程序。
在每个轴上,设采样位置的小数部分为
原程序使用相应的浮点近似常量。令
一次硬件线性过滤就能完成每对的插值。横向需要两个位置,纵向也需要两个位置,组合成四次双线性读取;最后用两轴的
例如
上升时先重建粗层,再与当前层保留的下降结果混合,才得到这一层的新结果。若各层都采用代表值 0.41,一个只存在于很粗层的贡献每向上传一层都会再乘相应混合比例;同时,每个较细层都重新加入自己的亮部。这是多种尺度共同组成光晕的过程,不是把最小图不断放大后一次性覆盖。
泛光之后继续进行最终颜色合成。当前还有较小尺寸的光晕或模糊支路,但不能据此把其他角色展示场景的完整景深机制移植到这份竹林分析中。
细节锐化、暗角与最终显示颜色
泛光重建完成以后,这帧还执行一条完整的颜色输出程序:先做邻域锐化与颜色缩放,组合泛光,再处理画面边缘的衰减,通过颜色查找表完成映射,最后进行显示编码与微小抖动。这些操作共同决定最终画面的细节对比、边缘亮度与显示色彩。
左图是该阶段读取的 HDR 颜色,按零到一范围预览;右图是完成显示颜色处理后的结果。两者处于不同颜色域,右图同时包含亮部合成和调色,不能把明暗差单独归给锐化。
五点邻域锐化先于颜色查表
程序读取中心和上下左右共五个样本。局部亮度变化与各通道的极值共同限制负的邻居权重,以中心和周围差异增强细节。将最终得到的邻居权重记为
本帧锐化强度参数为 0.3。
锐化结果之后乘当前约 6.5575 的颜色缩放,再与已有泛光结果组合。泛光合成还使用软阈值相关参数调整主体亮部与扩散贡献,不能简单写成把泛光贴图无条件覆盖到屏幕上。
画面边缘衰减独立于场景阴影
当前暗角以屏幕中心
宽亮度颜色先压缩到查表域
颜色查找表的实际尺寸是 1024×32,表示边长为 32 的三维颜色格。进入查表前,对每个颜色分量应用的主要压缩关系可整理为:
这里
显示编码与抖动发生在最后
查表后的线性颜色
之后加入由屏幕像素位置构造的 RGB 微小扰动。当前幅度约为
后面仍有两条受深度约束的晚期效果绘制,然后才拷贝到最终输出目标。该最终拷贝保留 RGB,并将 alpha 固定为零;场景的显示颜色已在前面的程序中形成,不能通过最终 alpha 去判断场景是否存在。
本帧效果的配合与分析范围
竹林表面先保存材质与可见性;方向体积按位置和朝向提供环境光,屏幕深度搜索形成局部遮蔽。反射由当前深度决定查询位置,旧 HDR 提供屏幕颜色,环境探针补足低权重区域;累积雾描述从表面到相机之间的空气。角色与后续受光面片读取这些条件,再按各自规则写回颜色、运动与分类。
完成所有当前帧写入后,整帧历史将深度、运动和类别一起验证,再交给多尺度泛光与最终显示。AO、反射、雾和整帧颜色各自保留所需状态,不能用一张统一的“历史图”替代全部依赖。
本文也展开了泛光之后的五点锐化、颜色缩放、屏幕暗角、对数查表和显示编码。最终拷贝的 alpha 为零不影响其已存在的 RGB;这里展示实际显示颜色,避免把输出通道约定误判为场景空白。
当前场景反射的分块查询、命中判断、旧帧校验、独立历史与环境探针补足已在本篇展开,并用关闭屏幕反射的回放对照验证了地面贡献。晚期受光面片也给出一条实际材质的深度淡出、受光及输出规则;本帧执行的径向光束结果为零,不将其归因为可见雾光。
仍未完整确认的是方向光照的生产算法、辅助反馈几何的全部具体部位、其余场景/角色材质与效果变体,以及连续运动时的更新行为。不同材质对同一反射输入的消费也需要分别核对。小尺寸模糊支路不能直接当作另一份角色展示截帧中的景深。






































































































































































