Files
workinf_Blender_Wasm/docs/status/RE_PBR_LIMITS_20261112.md
mes123456 d5dd647881
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
feat(web): finish RE 5000PBR lesson video and fix non-ASCII GLB import
- Add 11:07 Chinese-narrated lesson video, VTT, poster and 13 chapter screenshots.
- Regenerate 20-render WebGL2 matrix and 15 operation captures on RTX 4060.
- Fix WASM staging for non-ASCII import filenames (猴头.glb); rebuild web_engine.
- Harden lesson video recording pipeline; fix stale lesson-link E2E selector.
- Add RE PBR derived libraries, lesson page, evidence and status report.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-11-12 21:49:24 +08:00

6.8 KiB
Raw Blame History

RE 5000PBR 渲染已知限制:修补与验证记录

日期:2026-11-12 状态:功能实现完成;有头 Chromium 聚焦验证通过;整体产品验收仍由用户执行 (IMPLEMENTED_NOT_USER_ACCEPTED)

本轮决策

  • Chromium 限定:只做 Chromium 硬件 GPU 与 SwiftShader 对照;Firefox/WebKit 按仓库铁律不启动、不纳入验收。
  • 2048 高清验证 + 可选切换:默认标准 1024/512;re-pbr-hq 2048 库按需加载,材质名带 _HQ。
  • 诊断视图 + 教学曝光:保留原材质,增加 Final/Base Color/Normal/Roughness 与 0/+1/+2 EV。
  • Displacement 渲染与交互视口都执行:HEIGHT 绑定 + displacementMap;静帧有界细分,交互视口逐顶点位移。

逐条结果

1. Displacement / Height

  • 原生 reader:从 Material Output.Displacement 读取 ShaderNodeDisplacement,解析 Height 图、Midlevel=0.5、Scale=0.001; 输出 usage:"HEIGHT" binding 与 displacementImageId/displacementMidlevel/displacementScale。 同时改为从 packed JPEG/PNG 头读取真实尺寸(gen_x 只有 1024 时仍能识别 HQ 2048)。
  • 编译器:DISPLACEMENT 进入 allowlist;不再删除该节点;支持 IMAGE_TEXTURE → DISPLACEMENT.Height、 DISPLACEMENT → OUTPUT.Displacement、VALUE/MATH → Scale/Midlevel;HEIGHT binding 带 scale/midlevel/uvTransform。
  • Three.js:applyMaterial 设置 displacementMap、displacementScale、displacementBias=-midlevel*scale; HEIGHT 强制 Non-Color,禁止回退到 BASE_COLOR;原生/编译 binding 按 usage 合并。
  • 几何:静帧渲染对 968 三角形猴头做 level 3 中点细分到 61,952 三角形;交互视口使用原几何逐顶点位移, 编辑模式不细分,避免破坏拾取。
  • 教学强度:1× 保留源 Scale;10×/100× 只乘渲染时 displacementScale,不写材质/.blend。
  • 证据:tests/golden/RE-PBR-LIMITS-001/displacement/report.json (HEIGHT/scale/midlevel/bias、968→61,952、1×/100× PNG、mean 93.96/93.87、SHA 不同)。

2. 深色材质

  • Rendering 面板增加“视图”:Final / Base Color / Normal / Roughness;只临时替换活动对象材质,地面保留 Final。
  • 教学曝光 0/+1/+2 EV 只调整渲染曝光,不改变材质数据。
  • 证据:tests/golden/RE-PBR-LIMITS-001/diagnostics/report.json(3 张诊断图、曝光差异 >1)。
  • 桌面 EEVEE 参考脚本本轮未运行;EEVEE 不把 Material Output.Displacement 当几何位移, 因此即使补参考也只用于颜色/灯光,不用于位移验收。

3. 视口相机

  • 新增 viewPreset:SCENE_CAMERA 复用场景相机 worldMatrix 精确姿态;COMPARISON 以主体为中心 yaw + π/6、pitch +0.18、distance ×1.1。
  • PbrRenderPanel 增加“视角预设”;默认 SCENE_CAMERA;主视口 ViewportNavigation 不受影响。
  • 证据:最终 20 张采集 uniqueSha=20;SCENE/VIEWPORT 成片不再重复; tests/golden/RE-PBR-RENDER-001/report.json。

4. 重开 ready:0:0

  • 根因:重开时空 textureAssets 被当作 textureExpected=false,面板在 packed assets 到达前渲染并读取空状态; 另有 worker 完成时重盖章 snapshot revision、setSnapshot 重发旧 lastTextureStatus。
  • 修复:adapter 单调 textureRevision + expectedAssets;worker 丢弃旧上传、不重发旧状态; still 回传 textureStatus;面板从 still/最新状态取数;空列表且 expected>0 时 pending; GPUTextureStore.upload(..., {replace}) 清旧纹理;PbrRenderPanel 对当前 snapshot 做一次自愈式 cache。
  • 证据:重开 E2E data-texture-status=ready:5:0:,loaded===expected;最终采集 reopen 同为 ready:5:0:。

5. 硬件 GPU / 2048 / 跨浏览器

  • Playwright 与采集脚本支持 GPU_MODE/--gpu hardware;有头 Chromium 探测到 ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0); 硬件 lane 若回退 SwiftShader/llvmpipe 失败关闭。
  • 同一 1024 材质:硬件 mean 95.277/std 44.758,SwiftShader mean 95.332/std 44.724; 硬件 E2E 27s,SwiftShader 参考 35.8s(tests/golden/RE-PBR-LIMITS-001/gpu/batch0-gpu-enable.json)。
  • 2048 HQ:re-pbr-hq 10.8 MB、6 个 _HQ 材质、原始 packed JPEG;原生 reader 直接读 packed JPEG 尺寸, Height 图验证 2048×2048;GPU decoded 67,633,152 bytes(64.5 MiB)、payload 2,625,921 bytes、 loaded 5/rejected 0,低于 512 MiB。
  • 证据:tests/golden/RE-PBR-LIMITS-001/hq/report.json。
  • 跨浏览器:仓库规则 Chromium-only,Firefox/WebKit 未运行,记为 policy-excluded,不是工程缺口。

验证结果

检查 结果
npm run typecheck 通过
node --test tests/unit/shader-compiler.test.mjs 13/13 通过(含 HEIGHT/DISPLACEMENT/Value→Mapping)
有头 E2E 主流程(6 材质、位移 1×/100×、诊断、曝光、相机、重开) 通过(3.6m)
有头 E2E 截断 GLB 负例 通过
有头 E2E 原生 HEIGHT binding 通过(scale 0.001、midlevel 0.5)
有头 E2E HQ 原生 2048 尺寸 通过(Height 2048×2048)
有头 E2E HQ 按需加载与渲染 通过(67,633,152 bytes、ready:5:0)
check-re-pbr-limits.mjs PASS(位移/诊断/HQ/GPU/相机/重开)
最终有头硬件采集 20/20、uniqueSha 20、15 steps、0 errors
check-re-pbr-lesson.mjs PASS
check-re-pbr-library.mjs --hq PASS(10.8 MB、6 材质、2048)
PBR 资产库回归(有头硬件) 2/2 通过
PBR 教程回归(有头硬件) 通过(48.3s)

证据路径

  • 位移:/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-LIMITS-001/displacement/
  • 诊断/曝光:/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-LIMITS-001/diagnostics/
  • HQ 2048:/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-LIMITS-001/hq/
  • GPU 启用:/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-LIMITS-001/gpu/batch0-gpu-enable.json
  • 20 张硬件成片:/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-RENDER-001/
  • 统一检查器:/home/mes123456/workinf_Blender_Wasm/tools/web/check-re-pbr-limits.mjs
  • 教案:/home/mes123456/workinf_Blender_Wasm/web/app/public/tutorial/pbr/render-lesson.html

未验证 / 限制

  • 源 Displacement Scale=0.001;1× 很细微,100× 是教学放大,不代表源材质变强。
  • 静帧细分到 61,952;交互视口是原几何逐顶点位移,未做交互细分。
  • 未生成桌面 EEVEE 参考;EEVEE 不作为位移参考。
  • 2048 HQ 的 mipmap 可能使实际显存比 base-level 预算高约 1/3;仅按需加载。
  • 硬件 GPU lane 依赖 DISPLAY=:1 和 NVIDIA 驱动;无独显时需显式 SwiftShader。
  • 未做 Firefox/WebKit;用户实际使用验收仍待执行。