安全与导出
GPU canvas 一样吃 origin-clean。跨源图、跨源视频一旦进 texImage2D / importExternalTexture,表面就被标脏。脏了仍能合成到屏幕给用户看,但不能 readPixels、不能 toBlob / toDataURL。这不是导出策略问题,是安全模型。2D 侧同一套规则见 Canvas 污染。
截图还多一条 GPU 特有约束:默认 preserveDrawingBuffer: false,合成之后 drawing buffer 可以被清掉。你以为「画面还在所以能导出」,读到的是空缓冲。
文档清单
| 文档 | 解决的问题 |
|---|---|
| 污染 CORS 与 readPixels | taint、CORS 加载、读回抛 SecurityError |
| 截图与离屏导出 | 同帧读 FBO、preserve 的代价、blit 到 2D |
底线
- 脏了 没有「只导出不读像素」的后门。
readPixels、toBlob、toDataURL、把脏 GL canvasdrawImage进另一张 2D,一律失败或把脏性传过去。 preserveDrawingBuffer只决定缓冲还在不在,不是 安全开关,也不能拿来当每帧截图的默认。- 导出表面必须走自己的 loader:只产出 CORS 成功的
ImageBitmap/VideoFrame。热路径不要用 1×1readPixels探脏。
先读完这一章再进 10 生产场景 的视频纹理和离屏导出。需要像素笔刷、简单叠字,先问 Canvas 2D 够不够,不要为水印开着色器。