Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
在本演示中,我们以上一个示例为基础,将静态纹理替换为正在播放的 mp4 视频文件的帧。实际上,这很容易做到,而且观看起来很有趣,所以让我们开始吧。你可以使用类似的代码来使用任何类型的数据(例如 <canvas>)作为纹理的源。
第一步是创建将用于检索视频帧的 <video> 元素:
备注:请将以下声明添加到“webgl-demo.js”脚本的开头:
备注:请将以下函数添加到“webgl-demo.js”脚本中:
首先,我们创建一个视频元素。我们将其设置为自动播放、静音和循环播放视频。然后,我们设置了两个事件以确保视频正在播放并且时间轴已更新。我们需要进行这两项检查,因为如果将尚无可用数据的视频上传到 WebGL,它将产生错误。检查这两个事件可确保有可用数据,并且可以安全地开始将视频上传到 WebGL 纹理。在上面的代码中,我们确认是否同时发生了这两个事件。如果是这样,我们将全局变量设置 copyVideo 为 true,以表示可以安全地开始将视频复制到纹理。
最后,我们将 src 属性设置为 start 并调用 play 以开始加载和播放视频。
接下来的更改是初始化纹理,这很简单,因为它不再需要加载图像文件。相反,它所做的只是创建一个空的纹理对象,在其中放置一个像素,然后设置其过滤条件以供后续使用:
备注:请将“webgl-demo.js”中的 loadTexture() 函数替换为以下代码:
备注:请将以下函数添加到“webgl-demo.js”中:
你之前已经看过此代码。它与上一个示例中的 image onload 函数几乎相同——除了我们调用 texImage2D() 时传入的是 <video> 元素,而不是 Image 对象。WebGL 知道如何获取当前帧并将其用作纹理。
然后,我们需要在 main() 函数中调用几个新的函数。
备注:在你的 main() 函数中,将调用 loadTexture() 的代码替换为以下内容:
备注:你还需要将 Firefox.mp4 文件下载到你本地与你的 JavaScript 文件相同的目录中。
备注:在你的 main() 函数中,将 render() 函数替换为以下内容:
如果 copyVideo 为真,我们将会在调用 drawScene() 之前调用 updateTexture()。
这就是实现动画纹理的全部内容!