Skip to content

Prism Engine V2.2

Choose a tag to compare

@Qianjinqie Qianjinqie released this 31 Oct 00:20
· 9 commits to main since this release

Prism Engine V2.2 — 真机验证版

V2.1 之后的正式发行版。主线是把「只在软件适配器上验过」的 GPU 路径拉到真机上跑通,
并修掉真机暴露的三处缺陷;同时结清四项能力扩容。

⚠️ 升级提示:v2.1 单文件分发含已知缺陷

prism-engine-v2.1-source.txt(打包于 2026-10-27,早于修复提交 5b8ded4)包含 BSDF 多散射补偿缺陷:
Disney BSDF 的补偿采用「逐通道各自 F0 查表回填」,低 F0 通道被过量放大,补偿幅度不随 F0 单调。
表现为高饱和金属(金、铜)在低粗糙度、掠射角下整球偏成补色(金球发青绿)。

实测量级(金 f0=1.000/0.766/0.336,α=0.05、μo=0.25、μi=0.25):G 通道旧/新 3.85×、B 通道 18.92×,
极端掠射(μo=0.1、μi=0.8)B 通道达 49.83×。

v2.2 已修:改为 Fdez-Agüera 2019 彩色导体形式——幅度取白炉表(F0=1),色相由半球平均 Fresnel 承担。
关注掠射角补色一致性的用户请升级。

主要变更

流 A · 缺陷修复(真机暴露 + 测试盲区)

  • GI 存储布局去 vec3<f32> 依赖——真机驱动对结构体成员 vec3<f32> 的 size 处理与 WGSL 规范不一致(规范 size=12/align=16),导致 GiProbe.normal 读到 samples 哨兵 -1、后续字段整体错位。四个布局结构体全部改 vec4<f32>(布局零变化:GI_*_STRIDE_BYTES 一个字节未动,第 4 分量恒 0 不参与运算)。新增 gpu.gi_layout 作为真机判读锚点,并加两侧静态门禁(WGSL 存储布局禁 array<vec3<f32>>)。
  • GI SDF 球分支修正——return q.x 实为 |p.x−c.x|−r(沿 x 的无限大板),不是球 SDF;射线沿 y/z 前进时梯度恒 0,能否在 48 步内跨过 t_max 取决于浮点舍入累积。CPU 与 WGSL 同步改为 |p−c|−r;容量填充图元改为 radius 0 + center(0,−1e6,0),即使计数被误读也绝不命中。
  • 折射界面法线朝向 + Fresnel 余弦口径——介质内出射时法线未翻转,refract_dir 返回折回介质内部的伪方向,cos_v 被钳成 0 导致 p_reflect≈0.999 恒走全反射。表现即「玻璃球是不透明遮挡体、ior 零效应」。修复后 ior 1.0/1.5/2.5 由三帧逐位相同变为色心分离 2.504 px(阈值 1.0,cauchy_b=0 对照组 0.917 px 证明判据有效)。
  • Disney BSDF 多散射补偿形式(见上方升级提示)。

三项均未通过放宽容差 / 改判据 / 加 #[ignore] / 删测试来「转绿」。F32_TOL 仍 2e-6。

流 B · 能力扩容

  • 曲线图元可渲染——圆柱 / 圆锥 / 圆环 / 旋转曲面四类解析图元此前不可渲染(场景只有球 + 灯各 8 槽)。新增弦高受控三角化(hausdorff_bound = r_max·(1−cos(π/seg)))+ 扁平 BVH,同时接通三条路径:CPU 参考、Vulkan megakernel(参数块 22→24 字、绑定 4→6、双栈 BVH 遍历、Möller–Trumbore)、WebGPU scene_frame.wgsl(栈式遍历)。lavapipe 硬判据:四图元全部 max_channel_delta=0 && differing_pixels=0。场景 ABI 升 V2(6 绑定),输出恒为末位。
  • 材质库扩至十余种 + GGX 各向异性——MaterialKind 由 4 变体扩至 ≥10 预设;principled 新增各向异性(能量补偿闭式近似、无迭代),α_t==α_b 时与各向同性 GGX 逐位一致;DSL 老 3 字段场景输出逐位不变。
  • SVGF 空域降噪第二阶段——G-buffer 引导时域重投影(motion vector 闭式给出,不用光流、不引第三方)+ 方差引导 à-trous(保持有理核、零超越函数)。静态相机 + 静态场景下累积与「帧 0 起重放」逐字节一致;动态场景 PSNR 43.4 dB(判据 ≥40),同等画质 sample 数下降 91.7%(判据 ≥50%)。
  • 光谱渲染切片——采样维度新增 λ 轴,自研 CMF 分段有理式拟合(零 crate、零超越函数),RGB↔光谱升采样;单波长 + 恒定谱反射率下与 RGB 路径逐字节相等。

流 C · 真机 WebGPU 验证(本版主线)

轮次 设备 / 浏览器 wasm 结果
1 真机(SamsungBrowser 30.1 / Chromium 143 内核) 423,855 B 16 PASS / 1 FAIL(旧版,暴露病态球 SDF)
2 三星 SM-G9730 / Android 12 / Quark 10.18(Chrome 144 内核) 439,539 B 17 PASS / 1 FAIL(旧版,暴露 vec3 布局错位)
3 三星 Galaxy S10(骁龙 855 / Adreno 640)/ Quark 453,223 B 19 PASS / 0 FAIL
4 荣耀 X40(骁龙 695 / Adreno 619) 453,223 B(同一份字节) 19 PASS / 0 FAIL
5 Edge for Android 153 453,223 B 19 PASS / 0 FAIL
6 SamsungBrowser 30.1(Chromium 143)/ 新产物 ?v=8772008b 453,239 B 19 PASS / 0 FAIL

合计 4 个浏览器环境、2 台设备、2 个产物版本,各 19/19 全 PASS。

第 3、4 轮用同一份 wasm 跑在两台不同档位的设备上,排除「针对某台设备调参」。
第 6 轮首次完整采集到 adapter:vendor=qualcomm / architecture=adreno-6xx /
isFallbackAdapter=false / subgroup 64·128(SwiftShader 为 4·4)——硬件适配器由此直接确认,
不再依赖推断。gpu.scene_frame PSNR 52.5 / 52.9 dB,双跑逐位一致。

方法论结论:「CPU 参考 vs GPU 镜像」的自洽对拍,只有在两端算法本身正确时才有判别力。
两端同错时它恒绿,且 SwiftShader 与 CPU 浮点行为接近,永远无法暴露——只有真硬件 GPU 能。
推论:判据建立在「两端一致」上的测试项,必须至少有一条真机证据。

质量门槛

项 结果
全量回归 4029 passed / 0 failed / 0 ignored(188 测试段,release,全核并行 110s)
构建脚本 build.sh 429 passed / 0 failed
零第三方依赖 Cargo.toml / Cargo.lock 无外部 crate(全部 path 依赖)
wasm 体积 453,239 B(上限 458,752 B,余量 5,513 B)
WebGPU harness SwiftShader 19/19;真机 19/19(见上表)
打包回环 664 文件逐文件逐字节一致
反假绿 幽灵写入防御 / 卫生扫描 / 合规自检 / 全仓零 #[ignore]

包信息

  • 文件:prism-engine-v2.2-source.txt(664 文件 / 18.61 MiB / 19,518,616 字节)
  • SHA-256:b10fb669581edf30c6590fe2b4ef78704dcdad27bf481595b251febb948bb13c
  • 解包:取 TXT 内 UNPACK SCRIPT BEGIN / END 之间的脚本存为 unpack.cjs,运行 node unpack.cjs(Node 18+)
  • 验证:cargo test --workspace --release → 4029 passed / 0 failed

已知边界(诚实口径)

  • WebGPU 真机覆盖仅移动端:4 个环境全为 Android,桌面 Chrome/Edge 零实测——桌面后端不同(D3D12 / Metal vs Vulkan / GLES)。README 边界行维持「限 Chrome/Edge」,不写「WebGPU 已支持」。
  • GPU 覆盖仅 Qualcomm Adreno 两代(640 / 619)——正确说法是「跨两代 Adreno 驱动」,不是「跨 GPU 厂商」。ARM Mali / PowerVR 未覆盖,是当前实质性缺口。
  • 其余三轮 adapter 未采集,其硬件性属推断而非观测;本表只对第 6 轮作直接确认。
  • Metal 后端不点亮、is_available() 恒 false,metal/ 退为历史资产,不引入任何第三方翻译层。
  • 硬件编码只到「绑定就绪」档(VAAPI 符号表 + dlopen 结构化 Unsupported),不声称可编码。
  • DNG 合成交叉矩阵全绿,真实机型未经样本验证。
  • 异质体积仅支持单介质盒;光追为多弹射间接光——混合路径积分器默认 4 弹射(WF2_MAX_BOUNCES),GiProbe/CPU 求解 6–12 弹射、SDF-GI 可至 16 弹射,并含 Russian-Roulette 路径终止,非单步近似。

English summary

Prism Engine V2.2 pushes the GPU path from software adapters onto real hardware and fixes the three defects that only real devices could expose: a vec3<f32> storage-layout assumption that Android drivers violate (size=12/align=16), a broken sphere SDF branch returning q.x (an infinite slab, not a sphere), and unflipped interface normals turning glass into an opaque occluder with zero ior effect. It also lands four capability expansions: analytic curve primitives (cylinder/cone/torus/lathe) across CPU, Vulkan and WebGPU; a 10+ material library with GGX anisotropy; SVGF stage two (temporal reprojection + à-trous, PSNR 43.4 dB, 91.7% fewer samples); and a spectral rendering slice with a hand-rolled CMF rational fit. Verification: 4029 tests pass, wasm 453,239 B, and the WebGPU harness reaches 19/19 on real hardware across 4 browser environments and 2 devices — all Android, all Qualcomm Adreno, desktop still unverified. Single-file TXT distribution: 664 files, 18.61 MiB, SHA-256 b10fb669…8bb13c.