【发布时间】:2011-09-14 04:34:21
【问题描述】:
是否可以在 Canvas 或 WebGL 中呈现 HTML 元素? (类似于如何在 WebGL 中绘制视频元素纹理)
【问题讨论】:
标签: javascript html canvas webgl
是否可以在 Canvas 或 WebGL 中呈现 HTML 元素? (类似于如何在 WebGL 中绘制视频元素纹理)
【问题讨论】:
标签: javascript html canvas webgl
不,目前不可能,还没有。 但正如a video from 3rd WebGL Camp (at about 6:44) 中指出的那样,计划包含此功能。
【讨论】:
【讨论】:
您还应该查看http://robert.ocallahan.org/2011/11/drawing-dom-content-to-canvas.html
它可能会在 Chrome 中引发安全错误,但在 Firefox 中可以正常工作。
【讨论】:
使用这个库https://github.com/PixelsCommander/HTML-GL就像用<html-gl>标签包装你的内容一样简单。
【讨论】:
我只是想补充一下原因。
这与脏画布和 WebGL 发布后不久修复的计时攻击问题相同
使用 canvas 2d,您可以使用 ctx.drawImage(someImage, ...) 将图像绘制到画布中;问题来自跨域图像。通常 JavaScript 无法读取图像内的像素。它可以读取画布内的像素。因此,要从图像中获取像素,您首先将图像绘制到画布上,然后从画布中读取像素ctx.getImageData(...)
这是跨域图像(来自页面域以外的域的图像)的安全问题。
canvas 2d 的解决方案是在您将跨域图像绘制到内部标记为 dirty 的 2d 画布中的那一刻,ctx.getImageData 和 canvas.toDataURL 都会引发安全错误。
最初的 WebGL 遵循相同的规则。如果您使用跨域图像或脏画布调用 gl.texImageXXX,则 webgl 画布将被标记为 dirty 并且 gl.readPixels 以及 canvas.toDataURL 将不起作用。
聪明的人指出,在 WebGL 的情况下,这还不够,因为即使你不能调用 gl.readPixels,你也可以根据它正在访问的纹理的颜色设计一个需要更多时间的着色器。使用它,您可以计算访问纹理像素并有效重构图像内容所需的时间。
解决方案是默认情况下 WebGL 不允许跨源图像。相反,您必须向其他服务器请求 CORS(跨源资源共享)权限。只有授予权限,WebGL 才能使用该图像。
好吧,毕竟希望您能明白为什么不能将 HTML 渲染到 WebGL 中。如果您可以将 HTML 渲染为画布,那么您可以使用上述技术来读取该 HTML 的内容,包括嵌入式 iframe 等、脏画布、来自其他域的图像等...
【讨论】: