07-fog-implementation-spec.md 23 KB

视距雾气的实现规格

Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: 01,04,06

进度:100%

维护者在第 4 轮答复“全部按推荐来”:确认按决策范围收口、雾失效时业务可用优先、B 参数采用原型默认值。本票作为决策票 resolved;不等于进入过渡已修复、完整视觉验收通过或性能达标。首次人工反馈认可 B 的颜色/距离,仍保留“进入遮挡过晚”的真实失败记录。

下一步:已解除低精度 → 高精度过渡的解法的阻塞,由其细化并验证完整影像交接、取消/返回与加载失败恢复;后续实施保留 P95 帧耗时增幅 ≤15%、管线可读性和进出无突闪的硬验收。可执行 /to-spec 单独固化本票结论,不覆盖已有相机规格。按 AGENTS.md 本轮未运行 build/debug 或浏览器验证。

Question

在单一 Cesium 渲染器内,用自建深度后处理雾保护主场景区观感:归位视角保持可读,倾斜观察时远景与地平线瑕疵被柔和遮盖,进入途中可提前渐显,返回全球后恢复清晰。

边界:相机限位与进出动作沿用已收口的「限位与既有相机契约的合成 + 进出状态机」;完整影像交接方案归「低精度 → 高精度过渡的解法」。本票确定雾的观感、参数、生命周期与后处理合成约束,不引入第二渲染器。

实施与下游原型仍须验证(不作为本决策票未决项):

  1. 完整路径下的归位近景、浅俯角远景及进入/返回交接;B 默认参数已确认,原 60/20 km 高度带的进入演示存在失败记录,不能沿用为交接保证。
  2. 半透明管线与设备特效的实际深度表现,以及已确认降级路径能否保持业务可读性。
  3. 性能对比是否满足第 3 轮确认的 P95 帧耗时增幅不超过 15% 目标;当前没有性能实测结果。

Answer

最终决策(本节优先于下方讨论历史)

维护者第 4 轮确认“全部按推荐来”,对应 R4-1=A、R4-2=A、R4-3=默认。决策如下:

  1. 采用 B:仅地物距离雾。单一 Cesium PostProcessStage,使用世界射线距离;仅处理有效几何深度,无有效深度背景保持原颜色,不采用 C 的天空染色或太阳方向暖色。默认参数确认采用 18,000 m 起雾、42,000 m 完全遮蔽、#bdcdd6,中间平滑增浓。默认参数由维护者确认,不表述为自动采集的运行快照。
  2. 生命周期:可提前准备,主场景区稳定态启用;纯全球自由/引导态关闭。退出采用 0.8 秒淡出的已确认时长,但撤除时机须配合影像反向交接,不能先撤保护再收精细层。复用 stage 对象、离开页面销毁;禁用仍可能发生引擎内部资源开销,须实测。
  3. 保护准备/撤除的接口语义:雾提供是否支持、是否可执行、当前强度、配置参数及失败/降级原因;支持提前准备、进入/稳定态启用、退出淡出、取消过期请求与销毁。具体函数名由实施决定。ready 不等于边缘已遮住,strength 也不是整幅画面的保护证明;不得提供未经验证的全局 protected=true 承诺。
  4. 与影像的边界:已确认全球/引导先隐藏精细叠加影像,雾先形成有效保护后再渐显精细影像;返回反向交接。原型的 60/20 km 高度带不能单独作为可揭示影像的充分条件,人工反馈已证明当前进入演示太晚。精细层渐显时长、影像准备度、飞行路径及边缘风险判定由下游过渡票细化并原型验收,本票不反向等待它而锁死依赖。
  5. 无深度或雾运行失败:业务可用优先,关闭自建雾并如实提示,仍提供可用的近景和业务功能,不让影像永远等待不可能出现的雾就绪信号。具体无雾交接办法归下游过渡票;降级时不得宣称保证完全遮缝。主场景区配置不可用时沿用配置票的关闭路径。
  6. 业务可读性与特效:管线透明深度错位时允许减弱或暂关雾,保留限位并提示;设备三维特效随雾衰减,不开穿雾例外,面板状态信息不受影响。后处理特效在雾之前合成,开关独立;先后顺序不保证透明对象具有自身深度。
  7. 性能验收:同机、同分辨率、同视角及相同加载条件下,开启自建雾的 P95 帧耗时增幅必须 ≤15%,并单独检查首次启用及进出卡顿。超预算先优化,仍不达标则降低质量或关闭并提示。当前无性能达标证据,这一要求转为实施交付硬验收,不随决策票关闭而豁免。
  8. 收口口径:B 稳定态方案、默认参数、保护准备/撤除语义、异常降级及性能目标已明确,故本决策票收口。完整交接观感由下游原型验证,生产运行质量另行实施验收。原型保留为证据,不直接视为正式功能。

后续实际场景反馈(以 08 的最终 Answer 为准):维护者已基本验收低精度 → 高精度过渡的解法的原型方向,同时要求进出雾气变化稍快、雾色偏冷白灰且不得发绿、返回全球时镜头高度与雾气模糊同步变化并保持精细影像持续受保护。上述反馈未指定新秒数或色号;本票的 #bdcdd6 与退出 0.8 秒仅保留为早期原型默认参数,不作为正式实施的最终观感值。07 的历史决策仍保留,生产运行与性能仍须独立验收。

第 1 轮已确认

维护者原答复:

  • Q1 = (a) + 世界射线长。
  • Q2 = 暂定 C,具体观感需要做出一版效果之后再确认。
  • Q3 = B。
  • Q4 = A,不要压成夜空。
  • Q5 = A。
  • Q6 = 整级禁用 + 如实报。

据此记录:

  1. 距离口径:使用世界空间沿视线的相机到片元距离(米)。起雾约 15–20 km、充分遮蔽约 40–45 km 作为首版调参区间;具体单值与曲线待第 2 轮确定。该范围不是已验证的遮缝保证。
  2. 配色暂定:基础色配合轻微太阳方向调整。维护者要求先看一版效果再确认,当前不锁最终色值。
  3. 提前渐显:主场景区锁定时生效,并在进入途中按高度带提前渐显。不能仅用 locked 布尔值排除进入阶段。
  4. 天空参与:天空/地平线参与雾效;明确不得把天空压成夜空。此前把 #04121f 直接作为全天空最终色的建议不作为结论。
  5. 按需启用:接受 Q5=A 的节省开销方向。它必须与 Q3=B 合并为“进入途中及锁定阶段可启用,纯全球自由态与引导态关闭”;退出渐变细节待第 2 轮。enable/disable 不等于每次创建/销毁,生命周期策略待定。
  6. 能力降级:无可用深度支持时整级禁用,并如实提示;不默认用全屏常量色遮罩冒充距离雾。

第 2 轮已确认:首版参数与进出观感

维护者答复:R2-1=采用推荐;R2-2=A;R2-3=采用推荐;R2-4=B。

  1. 距离带初值:世界射线距离 18 km 开始起雾,42 km 达到完全遮蔽;中间平滑增浓,避免明显雾墙。作为首版可调值,不据此宣称全部视角遮缝已通过。具体曲线实现应保留两端语义;单纯指数衰减在有限距离不自动达到完全不透明,不能直接等同于上述端点。
  2. 天空与配色方向:选择“地平线浓、向头顶渐淡”,高处天空保留原亮度与层次。基础色首版走低饱和浅蓝灰,太阳方向仅作轻微暖冷变化,不把 #04121f 直接当作天空终色。最终色值与视觉效果仍须第一版原型过目确认。
  3. 进入阶段门控初值:仅在明确的进入主场景区飞行中,相机椭球高度降到 60 km 开始渐显,降到 20 km 达到完整雾效强度。该高度带控制整级强度,与 18/42 km 的片元距离带是两个独立量。落定后持续启用,不因拉近设备自动消失;自由全球浏览到相同高度不自动起雾。
  4. 退出策略初值:返回全球时用 0.8 秒淡出,淡出结束后禁用;再次进入复用 stage 对象,离开页面时销毁。不在每次进出时主动 remove/destroy。引擎可能在禁用期间释放内部资源,复用对象不等于保证无 shader 重建或无 framebuffer 开销,性能须实测。

上述为本轮已确认的首版方案;中途取消、连续进出等过渡竞态需在实现设计中保持单一当前目标,不能让过期淡出回调关闭新的进入效果。此处不新增业务模式。

第 3 轮已确认:业务优先级、特效合成与性能预算

维护者答复:R3-1=A;R3-2=A;R3-3=采用推荐,预算可以提高到15%。

  1. 透明管线可读性优先:若管线视图原型出现透明颜色与深度不匹配、近处管线被错误雾化等问题,允许该视图减弱或暂时关闭自建雾;保留相机限位并如实提示降级。接受此时远景遮蔽减弱的代价,不以完整雾效牺牲管线检查的可读性。这是条件降级,不预先认定所有管线视图都应关雾。
  2. 设备特效随雾衰减:三维设备特效随远景一起变淡、不开穿雾例外;面板内的报警文字与状态信息保持清晰。若特效使用后处理级,颜色合成按“先特效、后雾”;普通三维特效先在场景中渲染,再接受后处理。雾与特效独立控制开关,不把共用集合解释为必须同时启停。透明特效能否按正确深度衰减仍须原型验证。
  3. 性能目标改为 15%:在同一设备、分辨率、视角与相同加载条件下,对比关闭与开启雾效,目标为 (开启时 P95 帧耗时 / 关闭时 P95 帧耗时 - 1) ≤ 15%。记录基线与开启值,不把帧耗时增幅混写成 FPS 降幅;低帧率基线本身不因此合格。
  4. 单独检查切换卡顿:首次启用、进入/返回切换的明显卡顿另行检查,不能仅以稳定段 P95 合格替代。尚未执行任何性能测量,不承诺已经达标。
  5. 超预算处理:先优化;仍不达标时降低效果质量或关闭自建雾并如实提示,不静默牺牲交互流畅度。降低质量后的近景可读性、天空观感与远景遮蔽仍需维护者验收,不能以达成性能数字代替视觉确认。

首次人工原型反馈:采用 B,进入时序未通过

维护者原话:「方案使用B:仅地物距离雾,颜色和距离基本没有问题,但是进入演示时雾出现的太晚,完全没来得及遮挡矩形边缘,最终执行时需要解决这一点。」

  1. 方案选择已定:采用 B,仅对有有效几何深度的地物做世界射线距离雾;无有效几何深度的背景不由本级重绘。C 的地平线背景渐变与小幅太阳方向暖色均不纳入当前采用方案。这取代前轮“暂定 C、天空参与”的实现方向;不等于宣布所有视角的天空问题已消除。
  2. 颜色与距离反馈:维护者认可实际看到的 B 颜色与距离“基本没有问题”,因此本次不调整这些参数。源码初值是 18/42 km 与 #bdcdd6;未获取原型运行时快照,不能把源码初值冒充为维护者现场调参后的确切值,最终数值固化时应记录实际参数。
  3. 已知失败:进入过程中雾出现太晚,矩形边缘先暴露。现有 60/20 km 高度带不能当成已验收的进入遮挡契约;性能、半透明管线与修正后的进入过程均未通过本次反馈得到验收。
  4. 源码能确定的时序:演示先将相机放到全景,200 ms 后同时设置 entering 与调用 goHome;entering 的强度在高度 ≥60 km 时仍为 0,降到 ≤20 km 才到 1。源码不包含精细影像可见性的交接控制,也不等待遮挡就绪后再开始飞行。首次 shader 就绪耗时与矩形首次可见时刻未经测量,不能断言仅调高一个高度阈值就能解决。
  5. 正式交付的必要结果:进入全过程中,保护必须先于矩形边缘暴露成立。不得把已知瑕疵作为“静态 B 效果好”的可接受例外,也不得因只调整高度参数而宣称修复。
  6. 交接方向已确认:维护者随后答复“采用上述推荐方案”。保留 B 稳定态参数;全球自转/引导阶段隐藏精细叠加影像、保留粗略地球底图;点击进入后提前准备雾;雾已具备遮挡能力且接近主要区域时,才渐显精细影像。返回全球采用反向交接,在失去保护前收起精细层,避免退出途中再次暴露矩形边缘。
  7. 就绪与遮挡不可混为一谈:stage ready 只能说明处理级已可执行,不证明当前强度、视角与片元距离已经遮住边缘;同样,影像 provider 已创建不证明目标视野内瓦片已可显示。交接须以实际可见结果为判据,不仅等待固定计时器或换一个高度阈值。
  8. 范围与待定边界:本次确认的是精细叠加影像的可见性交接,不自动扩展为隐藏 DEM、3D Tiles、设备或业务面板;隐藏是否同时停请求尚未裁定。具体渐显区间、目标瓦片准备度、无深度/影像失败降级与取消/快速反向切换由后续过渡设计确定,不能以临时关闭粗底图造成空白来代替验证。完整交接细节由低精度 → 高精度过渡的解法持有,本票提供雾的保护准备与撤除要求;不新增反向阻塞。

依据纠正与失效约束

  • 「限位与既有相机契约的合成 + 进出状态机」已把上限改为 home.range(本部署 12,000 m),旧的 1,651 m 垂直覆盖预算不再作为本票参数约束。
  • 撤销原题面的“起雾/全不透明距离必须 ≤1,651 m”:地面跨度和相机到片元的射线长度是不同量;“起雾更远反而吞掉近景”的方向推理也不成立。它并非仅因限位改变才失效,而是原推导本身有误。不能把该不等式简单改成 ≤12,000 m。
  • 先前用 1/sin(|pitch|) 外推浅俯角可见跨度,只是局部近似。视锥跨地平线时不能据此宣称有限的 89 km 地面跨度或保证所有方向遮缝;真实地形、椭球、相机位置和视锥均会影响结果。
  • Three haze “50% 衰减约 56 km”来自旧报告的特定高度与参数假设,不代表在约 10 km 高度的归位视角可直接复用;50% 衰减也不等于完全遮蔽。旧“密度提高约 30 倍”和上轮“现在默认参数几乎正好”都不作为调参结论。
  • Context.depthTexture 是布尔能力标志,不是要传入的纹理。深度采样走 PostProcessStage 提供的 depthTexture uniform。
  • 天空无有效几何深度,不能把它不加区分地当成普通地表远片元。维护者已选择 B:本级对无有效几何深度的背景保留输入颜色,不沿用 C 的天空染色分支。

Comments

第 1 轮答复记录与第 2 轮准备

已按维护者逐条答复登记 confirmed / provisional 的区别。Q2 的色调必须经第一版效果确认,不能提前标为通过。

第 2 轮将询问:首版起雾/遮蔽参数与曲线、天空亮度及地平线过渡、进入高度带与退出渐变。后处理深度、天空与半透明对象的技术边界另做只读核查,事实不转嫁给维护者猜测。

本票与「低精度 → 高精度过渡的解法」存在前后依赖:本票的配色验收应可用独立雾效果完成,不必等待整套影像过渡原型,否则可能互相等待。未执行新的原型任务,也未修改该票依赖。

只读技术复核:天空、透明对象、生命周期与排序

依据当前安装的 @cesium/engine 26.3.0 源码。以下为事实与限制,不是新的维护者产品裁定;未做 GPU、浏览器、构建或测试实测。

  1. 无几何深度不是“真实无限距离”。场景深度清为 1.0(node_modules/@cesium/engine/Source/Scene/Scene.js:223),天空盒和大气不写深度(Scene/CubeMapPanorama.js:266、Scene/SkyAtmosphere.js:291)。shader 应先识别无有效几何深度,再走背景分支;该标记也可能对应没有写自身深度的透明内容,不能把它当作可靠的天空对象分类。
  2. 只反解一次对数深度。Shaders/Builtin/Functions/readDepth.glsl:1 返回反解后的投影深度,不是米制距离;windowToEyeCoordinates.glsl:67 的 vec2+depth 重载内部自己解 log,不能先 reverseLogDepth 再重复解。反投影还需齐次除法;沿射线距离应取重建位置的长度,不是直接取负 z。无几何/远平面应先分支,避免远端数值误差。
  3. 禁用与移除不同。PostProcessStage.js:876 在禁用后的 update 释放部分资源并返回,:952 避免本级 draw;对象仍可再次 enabled,但不能保证保留全部已编译资源。PostProcessStageCollection.js:473 的 remove 会 destroy,对象不可复用。集合仍含禁用 stage 时,Scene.js:4023 仍可能准备/清理后处理 framebuffer;所以不得写“禁用即完全零 GPU 成本”,也不得保证“复用对象就完全没有重建开销”。具体差异待测。
  4. 半透明颜色不保证有匹配深度。透明 globe 路径 GlobeTranslucencyState.js:571 的 depthMask=false;默认 BillboardCollection 的透明 pass 也不写深度(BillboardCollection.js:1826),但 TRANSLUCENT-only 存在不同处理,不能一概而论。OIT 派生命令也可强制 depthMask=false(OIT.js:447)。后处理颜色可能含透明地表/特效,深度却来自背后的地物或清屏值。管线视图与透明特效须列为原型验收场景,不能承诺全对象自动获得正确距离雾。
  5. 排序不决定开关绑定。自建 stage 的颜色按加入顺序串联、深度沿用同一张场景纹理(PostProcessStageCollection.js:819);各 stage 的 enabled/support 独立筛选(:587)。“先特效、后雾”可以让已有特效颜色被雾衰减,但不生成特效自身深度,也不意味着两级必须同开同关。是否让业务特效免雾或共用门控仍是产品裁定,不把平行图研究建议当作已确认结论。

此前第 2 轮待答,技术复核本身不增加决策完成数;现维护者已答复 R2-1 至 R2-4,结果见 Answer 第 2 轮。

第 3 轮 frontier

本轮询问:R3-1 管线视图出现透明深度不匹配时是否优先可读性;R3-2 三维设备特效是否随雾衰减且独立开关;R3-3 同条件 P95 帧耗时对比与超预算处理。原建议预算为 10%。

维护者已答复 R3-1=A;R3-2=A;R3-3=采用推荐,预算可以提高到15%。答案已录入 Answer 第 3 轮,最终预算为 15%,取代提问中的 10%。目前不再重复询问已确定的产品取舍;下一阶段是原型观感与性能验证,未 close。

Wayfinder 续推:独立雾原型已准备

按最解阻原则继续本会话已认领的「视距雾气的实现规格」:其全部依赖 resolved,而「低精度 → 高精度过渡的解法」仍阻塞在本票。未新增重复票、未越过其依赖、未关闭任何票。

原型资产与运行/撤除方法见雾原型验收入口。现有 /cockpit 仅在 DEV 且 route query fogPrototype=1 时懒加载原型;三个变体为关闭自建雾、仅几何距离雾、几何距离雾+地平线背景。未改地图服务、相机控制、配置文件或并行工作文件,仅在薄页面入口添加可撤除挂载。

只读复核修复了 hash 路由参数位置、采样历史递归嵌套及内置视觉雾污染对照三项问题。保留透明深度、无几何背景、禁用 stage 残余开销的限制说明;原型采样只是渲染事件帧间隔,不代表 GPU 时间或自动性能通过。

原型首次准备时曾列出天空染色验收;该方向已由后续人工反馈选择 B 取代。当前 B 颜色/距离基本可用,进入演示的遮挡时序未通过;管线场景与性能未提供完整证据。尚无帧耗时实测,没有无原型基线,不能宣称达成 15%。原型有效结论产生后才存档 throwaway 分支,当前未提交/切分支以免带入其他工作区改动。

Wayfinder 第 4 轮:解除规划与实施验收混用

本会话继续持有本票。已核对地图 Destination 为“锁定可实现契约”、Notes 为“只产出决策,不实现功能”。六张前置/相邻票已 resolved,本票已 claimed,下游「低精度 → 高精度过渡的解法」依赖本票;未认领的新 frontier 为空。

发现问题:本票提供雾契约,下游负责完整交接原型;若本票反过来以完整交接验收作为关闭前提,将形成流程上的互相等待,虽无显式依赖环也不能推进。性能达标是尚未完成的实施验收,不应冒充已有证据。

本轮待维护者裁定(尚无答案):

  • R4-1:是否将本票的收口限定为 B 稳定态方案、保护准备/撤除接口、异常降级与性能目标均明确;完整交接观感归下游原型,15% 目标保留为实施交付硬验收,不因决策票收口而视为通过。若要求本票先完成全套运行验收,则须明确调整下游阻塞关系并授权所需验证,当前不自行调整。
  • R4-2:雾无深度支持或运行失效时,是业务可用优先(关闭雾并提示,仍提供可用近景/业务;不得宣称已满足遮缝),还是无保护便不交接精细层、保留粗底图等待恢复/返回。建议业务可用优先,具体无雾过渡手段留给下游,不令图层永远等待不可能成立的雾就绪信号。
  • R4-3:维护者观看 B 时是否保持原型默认 18/42 km、#bdcdd6,还是曾调过;以实际看过的参数为依据,不拿源码默认冒充实测快照。

术语约束:fog stage ready 仅是可执行状态,strength 是当前渐变强度,二者均不是“矩形边缘已被遮住”的全画面证明。雾提供状态/参数,影像过渡根据其路径与边缘暴露风险作交接判断;不新增未经验证的 protected=true 全局承诺。

Resolution:第 4 轮确认,按决策范围收口

维护者答复“全部按推荐来”,确认 R4-1=A(决策收口)、R4-2=A(业务可用优先降级)、R4-3=默认(18/42 km、#bdcdd6)。最终结论已归并到 Answer 首节,Status 从 claimed 转 resolved、进度 100%。

原型正向进入“遮挡过晚”的缺陷并未修复,性能与透明管线仍无完整运行验收;这些不被抹去或宣布通过。完整过渡交接归下游原型,运行质量和 ≤15% 性能目标归正式实施硬验收。地图只新增本票的简要索引,下一 frontier 为「低精度 → 高精度过渡的解法」。本轮未开始或关闭其他决策票,也未改生产/原型运行代码。

/to-spec:雾气规格单独发布

依维护者要求,已把本票最终决策固化到主场景区地物距离雾规格(Status: ready-for-agent、Label: ready-for-agent)。它与已有相机限位 spec.md 并列,不覆盖相机规格。完整交接与运行性能仍按规格所列留待后续决策与实施验收。