Repository navigation
Prism Engine V2.2
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)、WebGPUscene_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.