From 5bda548fe9b9a1a63be22d11452904b255f830ae Mon Sep 17 00:00:00 2001 From: VicoHu <46861221+VicoHu@users.noreply.github.com> Date: Tue, 8 Sep 2026 16:58:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=203D=20=E5=AF=BC=E6=BC=94=E5=8F=B0?= =?UTF-8?q?=20-=20=E4=BF=AE=E5=A4=8D=E7=99=BD=E8=86=9C=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=B8=B2=E6=9F=93=E5=BE=AA=E7=8E=AF=E9=80=90?= =?UTF-8?q?=E5=B8=A7=E5=B4=A9=E6=BA=83=20(#439)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 导出白膜视频得到的是 0 秒视频:文件实测仅 1 帧(ffprobe nb_read_frames=1,duration=0.001s),却无任何报错并照常回写画布。 根因:applyClaySceneMaterials 把场景内所有非 actor mesh 的材质换成 clay MeshStandardMaterial,drei Grid 的 GridMaterial(带 uniforms 的 ShaderMaterial)也在其中。Grid 组件内部 useFrame 每帧读取 material.uniforms.worldCamProjPosition,材质被换后 uniforms 为 undefined,渲染循环逐帧抛 TypeError,R3F 不再产出新帧, captureStream 只录到启动前手动 gl.render 的那一帧;5 秒后 setTimeout 照常 stop,残缺视频被当作成功结果。开启轨迹显示 (drei Line 同为 uniforms 材质)或视口白膜显示模式时同样触发。 修复: - applyClaySceneMaterials 跳过带 uniforms 的 ShaderMaterial, 并抽到 lib/canvas/director/director-clay-materials.ts 补回归测试; - recordCanvas 加固:录制期间监听 window 未捕获错误,首个渲染 错误立即中止并报错;录制结束用