Skip to content

Releases

Prism Engine V3.0.1

Choose a tag to compare

@Qianjinqie Qianjinqie released this 08 Nov 13:39

Prism Engine V3.0.1

V3.0 之上的增量版本:点亮 2D 矢量路径光栅的 GPU 通路,并重做光栅算法与若干渲染热点,解析覆盖率精度与速度同时提升。V3.0 及更早(含 V2.5 能力对齐、语言层与观感体系)的完整能力说明见 V3.0 Release,本页只写增量。

本版增量

2D 矢量路径光栅:GPU 通路点亮

  • 双端同式:Vulkan SPIR-V compute 与 WebGPU/WGSL compute kernel,与 CPU 扫描线解析覆盖率逐字节一致
  • 真接线:PathMask 逐帧全分辨率遮罩接入「GPU 优先 / CPU 兜底」入口,无需再烘焙成位图;无设备时自动回退 CPU
  • 真机判据:llvmpipe (LLVM 20.1.2, 256 bits) 9 用例 dispatch→fence→readback,differing_pixels=0、两跑逐字节一致;对 f64 精确面积标尺最大差 1.79e-7
  • 反假绿负控:扰动 kernel 系数使判据 FAIL,证明绿灯来自真实 GPU 执行,而非 CPU 兜底蒙混过关
  • 依赖方向保持单向:postfx → {gpu, raster},prism-raster 不反向依赖 GPU

此前这一项在「诚实的边界」里被列为仅 CPU 扫描线,本版销号。

2D 扫描线光栅重写(速度与精度同时提升)

用例 优化前 优化后 倍数
圆 64 段 1080p 5.878 ms 0.225 ms 26×
星 512 段 1080p 656.131 ms 3.541 ms 185×
星 512 段 4K 2295.932 ms 36.900 ms 62×
星 2048 段 4K 19914.446 ms 70.682 ms 282×
  • 拆掉三处平方级复杂度:列折点不再作为事件、内部列 O(1) 批量加、活跃跨越序增量维护;交点按 x 区间剪枝
  • 几何量提到 f64、只在写回缓冲时舍入一次:相对精确面积标尺的偏差从旧实现 5.1e-5 降到 3e-8(旧实现在 4K 坐标上本身就会丢精度)
  • rasterize_into 缓冲复用:星 512 4K 35.4 → 13.6 ms、星 2048 4K 67.9 → 46.0 ms
  • 341 组对拍(288 组对精确面积标尺 + 53 组对旧实现),含自交、孔洞、双填充规则、退化、260 组固定种子伪随机多边形;最大绝对差 4.17e-7
  • 负控:把梯形积分系数 0.5 改成 0.51 ⇒ 8 个测试立即 FAILED,证明对拍没有空转

其他渲染热点(不局限在 2D 光栅)

  • mean_samples(spp=16) 134.19 → 57.94 ns/px(2.3×):消除每像素 Vec 分配
  • Bsdf::eval 71.51 → 62.63 ns:引入轻量求值预算
  • 均有逐位对拍(n=0..=128 全等、234090 组 Vec3 逐位全等)

工程

  • 全量测试 4629 passed / 0 failed / 0 ignored(239 个测试段)
  • spv_freshness 5/5;wasm 748,758 B < 786,432 B 上限;Cargo.lock 第三方依赖计数 0
  • 单文件分发包:789 个文件 / 22.1 MB,解包回环 789/789 逐文件逐字节一致

分发与校验

  • 仓库根目录只保留最新版单文件包 prism-engine-v3.0.1-source.txt;v3.0 及更早版本的包归档在各自历史 Release 的 Assets 中,未删除
  • SHA256SUMS.txt 累计四行(v2.1 / v2.2 / v3.0 / v3.0.1),四行哈希全部与各自 Release asset 逐字节相符;本版 digest 9c1177e5…
  • 只下载本版包时,按当前版本过滤校验,避免历史行因文件不在本地而误报:
curl -L -O https://github.com/Qianjinqie/prism-engine/releases/download/v3.0.1/prism-engine-v3.0.1-source.txt
curl -L -O https://github.com/Qianjinqie/prism-engine/releases/download/v3.0.1/SHA256SUMS.txt
grep 'v3.0.1' SHA256SUMS.txt | sha256sum -c -

升级

从 v3.0 升级:取本版单文件包,按 README「三分钟跑起来」还原即可。场景语义不变——首行 // prism-dsl 2 仍走 V3.0 语言前端,无版本头或 // prism-dsl 1 仍走 v2 路径、产物逐字节不变;旧 .prism 文件行为完全兼容。

Prism Engine V3.0

Choose a tag to compare

@Qianjinqie Qianjinqie released this 08 Nov 00:29

Prism Engine V3.0 — 能力对齐 + 语言层与观感体系

本版是两部分合起来的交付:V2.5 的能力对齐(此前只在代码库里,没有单独发版、也没有任何对外说明)与 V3.0 的语言层与观感体系。
如果你只跟过 v2.2,下面第一节就是这两版之间补掉的全部能力。


一、V2.5:能力对齐(未单独发版)

目标只有一个:把「能不能做」这个问题结清。结清之后不再回答,回到引擎本心。

渲染

  • 位图纹理管线:UV + 双线性 / 三线性 + 7 级 mip + 法线 / 粗糙度贴图 + sRGB 解码。双线性 4096 采样点 0 ulp,7 级 mip 链斜视 0/3072 像素差,sRGB 往返 ≤0.5/255,CPU↔Vulkan 三档 0/3072
  • HDR 环境光 / IBL:环境重要性采样 + MIS。与参考实现偏差 0.325%(split-sum 近似为 26.424%);设备白炉 1024 样本 ≤1e-2、8192 样本 ≤5e-3
  • 几何实例化:112 B 实例槽 + 局部 BLAS + 法线 det(A)·A⁻ᵀ·n 回世界空间。1 万实例与 CPU 权威逐位一致;Vulkan llvmpipe 0/256、浏览器 WebGPU 0/256
  • 细分曲面 + 位移贴图:Catmull-Clark 极限 stencil 三个解析值 ≤1e-6;位移在烘焙期与运行期两条通路都已闭合,不是只在离线烘焙里有效
  • 逐像素自适应采样:方差引导 + 收敛判据 + 迭代精化;同画质下采样数 0.9175×
  • 多层参与介质:互斥区域 + 优先级全序,均匀与异质网格(delta tracking)都支持;白炉 τ≤0.2 最差 5.334e-5,CPU↔wavefront 0/108
  • 毛发几何:毛股曲线 + 按股标架 + 曲线 BVH 合流 + 按 f 的 Marschner 采样器(∫pdf dω = 0.999999955,白炉相对差 8.181e-5)

格式与工作流

  • OCIO 配置:自研 config.ocio 解析(colorspaces / roles / displays+views / looks + 六类 transform),烘焙成 Q24 定点 1D shaper + 3D cube LUT,纯整数求值、零 libm;17³ 网格点上 LUT 与直接求值最大偏差 3.590e-7
  • USD 完整度:真解析二进制 .usdc Crate(TOC / LZ4 / value rep)+ .usdz 解包,不再只认 USDA 文本
  • MaterialX 完整度:21 种节点 / 45 别名 / 17 个 BSDF 槽,节点图可编译成 BSDF
  • 实时预览视口:预览就是同一套路径追踪器的低预算档,不是另写一套;静态图与预览帧逐字节相同

明确不做(已裁定,理由写在这里)

  • 桌面 WebGPU 单独验证:软件适配器 + 2 台 Adreno + 3 个浏览器实测已经足以证明代码路径,重复验证无增量
  • 额外的容器 / 编码桥:内置 MJPEG-in-MP4/AVI 与 EXR / PNG / JPEG / DNG 已零依赖自包含、永远能出片;需要别的容器,用 FFmpeg 几秒转封装即可,不值得为它自研编解码
  • 灯端口 / 路径引导 / 光子映射:三项分别被 MNEE、立体角 2D CDF + MIS、NEE + MIS 覆盖,再实现一遍不增加画面能力

未点亮(缺真机,一律不写「支持」)

项 缺什么 什么时候复验
Metal(iOS / macOS) 无 Apple Silicon / macOS 设备 取得任意 M 系列设备即复验 19 项
硬件编码(NVENC / QSV / VAAPI / VideoToolbox) 无对应真机 取得任一硬件编码器
ARM Mali / PowerVR 现有覆盖只有 Qualcomm Adreno 640 / 619 取得 Mali 或 PowerVR 设备

能力矩阵终态:39 项中,除上表 3 项缺真机、2 项明确裁定不做外,其余全部对齐;「部分」0 项、「缺失」0 项。


二、V3.0:语言层与观感体系

V2.5 把能力补齐,V3.0 把「能力能不能被写出来、写出来像不像人搓的」这两件事做完。

语言层:每一项能力都能从语言层写出来

  • 单文件形态:一部片子 = 一个 .prism 文件,资产以内容哈希锁定,缺资产结构化报错带行号
  • 自研 LL(1) + Pratt 前端(零第三方解析库):缩进块、表达式、变量、def、for / if、列表 / 字典字面量、字符串插值、全链路行号报错
  • 确定性受限子集:种子是一等字段且进产物哈希;det_* 零 libm 标量函数;求值顺序固定、换序可检出;不做图灵完备
  • 39 项能力触达 100%:226/226 参数从 DSL 可达——第一节里那些能力(纹理 / IBL / 实例 / 细分 / 位移 / 介质 / 毛发 / 自适应 / OCIO / USD / MaterialX)全部可从语言层写出,不用回到 Rust
  • 七族旧拒绝项全部销号:particles / sim / compose / morph / light / audio / post 不再拒绝
  • 任意参数时序驱动:统一命名通道按帧 / 关键帧驱动任意参数,逐帧值可断言

观感体系:画面不像代码生成

  • finish = analytic | crafted 双一等档:进产物哈希,漏填即静态报错;匀质是合法交付物,不是失败——用户要均匀就选 analytic
  • 六族痕迹注入生成源头(运动 / 几何 / 材质光照 / 时间镜头 / 构图色彩 / 剪辑音画):在 movie.rs 组装材质光源之前消费,不是出帧后贴 grain
  • 两条禁令做成静态门禁:痕迹挪到帧后贴皮 ⇒ FAIL;用真随机替代种子化噪声 ⇒ 两跑字节不一致 ⇒ FAIL
  • 盲测 64/64(门槛 0.75),判官为确定性可计算函数且真盲(b_first 由 hash_mix 打乱);反假绿负控 0.4375 证明判官不是无条件选 B
  • 客观侧证:prism-aesthetic 五维 critic 总分降 0.099999,在冻结容差 0.25 内(画质不退化)

工程

  • 全量测试 4580 passed / 0 failed / 0 ignored,29 crate,0 第三方依赖
  • 三后端一致(CPU / Vulkan-SPIR-V / WGSL),确定性两跑逐字节
  • 单文件包:779 个文件 / 21.9 MB(下方 Assets;仓库根目录始终只放最新版,现为 v3.0.1)

⚠️ 校验文件修正

v2.2 的 SHA256SUMS.txt 记录的 v2.2 包哈希有误(d2b4e919…),与 asset 实际内容(b10fb669…)不符,
当时 sha256sum -c 会报 FAILED。本版已修正,SHA256SUMS.txt 三个版本的哈希全部与 release asset 逐字节相符。

升级

从 v2.2 升级:取下方 Assets 里的本版单文件包,按 README「三分钟跑起来」三步还原即可。仓库根目录只保留最新版分发包(现为 v3.0.1),历史版本一律在各自 Release 的 Assets 中归档。
旧 .prism 文件按 // prism-dsl 1 版本语义恒等 analytic,行为不变、逐字节同帧。

Prism Engine V2.2

Choose a tag to compare

@Qianjinqie Qianjinqie released this 31 Oct 00:20

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.

Prism Engine V2.1

Choose a tag to compare

@Qianjinqie Qianjinqie released this 27 Oct 05:13

Prism Engine V2.1 — 长尾收口版

V2.0 之后的第一个正式发行版。五个长尾缺口按「一重两轻」三路结清,质量门槛全绿。

主要变更

流 A · GPU 渲染管线(重)

  • Vulkan render_scene 光追管线真实化:自研发射器生成光追 megakernel(主射线 + 球/灯动态循环 + aesthetic 后处理槽),lavapipe 实机出帧;
  • 与 CPU 参考 逐字节 0 差异(64×48 / 113×47),GPU 双跑逐位一致;
  • is_available() 升级为 compute ∧ render 双自检(「可用却出空帧」被测试排除);
  • Metal 同构移植 + 编译门控(未实机验证、不点亮);WebGPU 可行性结论(4–6 人日,无渲染路径)。

流 B · 资产判据与签名闭包(轻)

  • USD 资产 R1 同构保持判据 + R3 Hausdorff 保真度界(≤ √3/2·h),R2 字节往返不动点不回归;
  • 签名闭包 S3 收尾:迭代节点键含 (ε, n)、流节点键含 frame、S4 逐出中性;None 时逐字节退化为旧键(零回归)。

流 C · 长尾盘点 + 异质体积 + T4(轻)

  • #10 渲染特性长尾按 K1 三元组盘点成文(K 核 / σ 求逆策略 / d 采样维度),收敛判据可机械判定;
  • 异质体积(Woodcock delta tracking)接入 integrator / wavefront 双渲染路径;σt 恒定场与均匀实现逐位一致;
  • T4 色彩债务结清:sRGB↔ACEScg 矩阵按官方 AP1 原色 + Bradford(D65→D60) 重录,逆阵 f64 精确重算;旧 Hill 拟合值保留为 SRGB_TO_ACESCG_FITTED_HILL 显式可选口径;
  • 2 条 C15 渲染行为变化登记(T4 矩阵、BakedSdf brick 边缘插值修复)+ 1 条能力扩容清单。

质量门槛

项 结果
全量回归 3929 passed / 0 failed / 0 ignored(179 测试段,release,全核并行 171.5s)
零第三方依赖 Cargo.toml / Cargo.lock 无外部 crate(全部 path 依赖)
打包回环 642 文件逐文件逐字节一致
解包树构建 cargo check --workspace --release 通过
反假绿 幽灵写入防御 / 卫生扫描 / 合规自检(9/9 + 反向自证 8/8)/ 全仓零 #[ignore]

包信息

  • 文件:prism-engine-v2.1-source.txt(642 文件 / 18.06 MiB / 18,939,405 字节)
  • SHA-256:a7919e2b390c64ea04a70eb0fcd8fe283ff5a2d04c3f168d4367b7bbc9493c32
  • 解包:取 TXT 内 UNPACK SCRIPT BEGIN / END 之间的脚本存为 unpack.cjs,运行 node unpack.cjs(Node 18+)
  • 验证:cargo test --workspace --release → 3929 passed / 0 failed

已知边界(诚实口径)

  • Metal 后端未实机验证、不点亮;WebGPU 无渲染路径;
  • 异质体积仅支持单介质盒,无多区域嵌套 / 介质边界折射;
  • 真实 DNG(Compression=7,lossless JPEG)仍不可读;视频编码仍走 ffmpeg 协作 / 硬编探测链;
  • 硬件 GPU 上的加速比需在目标环境实测——本版 GPU 判对在 lavapipe 软件 ICD 上完成;
  • 光追只做一步间接光,无全局多次弹射。

English summary

Prism Engine V2.1 closes five long-tail gaps: Vulkan ray-traced scene rendering with byte-identical CPU parity, USD R1/R3 asset criteria, S3 signature closure, heterogeneous volume wired into both render paths, and the T4 color-matrix debt settled (official AP1 primaries + Bradford, f64-exact inverse, legacy Hill matrix preserved as an explicit opt-in). 3929 tests pass with zero third-party dependencies. Single-file TXT distribution: 642 files, 18.06 MiB, SHA-256 a7919e2b…493c32.