跳到主要内容

安全与导出

GPU canvas 一样吃 origin-clean。跨源图、跨源视频一旦进 texImage2D / importExternalTexture,表面就被标脏。脏了仍能合成到屏幕给用户看,但不能 readPixels、不能 toBlob / toDataURL。这不是导出策略问题,是安全模型。2D 侧同一套规则见 Canvas 污染

截图还多一条 GPU 特有约束:默认 preserveDrawingBuffer: false,合成之后 drawing buffer 可以被清掉。你以为「画面还在所以能导出」,读到的是空缓冲。

文档清单

文档解决的问题
污染 CORS 与 readPixelstaint、CORS 加载、读回抛 SecurityError
截图与离屏导出同帧读 FBO、preserve 的代价、blit 到 2D

底线

  1. 脏了 没有「只导出不读像素」的后门。readPixelstoBlobtoDataURL、把脏 GL canvas drawImage 进另一张 2D,一律失败或把脏性传过去。
  2. preserveDrawingBuffer 只决定缓冲还在不在,不是 安全开关,也不能拿来当每帧截图的默认。
  3. 导出表面必须走自己的 loader:只产出 CORS 成功的 ImageBitmap / VideoFrame。热路径不要用 1×1 readPixels 探脏。

先读完这一章再进 10 生产场景 的视频纹理和离屏导出。需要像素笔刷、简单叠字,先问 Canvas 2D 够不够,不要为水印开着色器。