- 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>
6.8 KiB
6.8 KiB
RE 5000PBR 渲染已知限制:修补与验证记录
日期:2026-11-12
状态:功能实现完成;有头 Chromium 聚焦验证通过;整体产品验收仍由用户执行
(IMPLEMENTED_NOT_USER_ACCEPTED)
本轮决策
- Chromium 限定:只做 Chromium 硬件 GPU 与 SwiftShader 对照;Firefox/WebKit 按仓库铁律不启动、不纳入验收。
- 2048 高清验证 + 可选切换:默认标准 1024/512;
re-pbr-hq2048 库按需加载,材质名带_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-hq10.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;用户实际使用验收仍待执行。