WebGL 2 登陆 Firefox

随着 Firefox 51 的发布,WebGL 2 支持已经登陆!WebGL 是一个用于在 Web 中渲染 3D 图形的标准 API。它基于 OpenGL ES,OpenGL ES 常用于移动游戏。

到目前为止,我们已经可以使用 WebGL 1(基于 OpenGL ES 2)将精美图形渲染到 <canvas> 元素中。然而,WebGL 2 基于OpenGL ES 3.0 规范,它引入了新的功能,其中许多功能旨在提高性能和视觉保真度。

直到今天,WebGL 2 只能在开发者版或夜间版中使用,或者通过一个标记启用,但随着 Firefox 51 的发布,它现在对 Windows、MacOS 和 Linux 上所有 Firefox 用户开放。

演示: “After the Flood”(PlayCanvas)

为了让您体验 WebGL 2 能够实现的内容,我们很高兴向您介绍 After the Flood,这是PlayCanvas 开发的交互式 WebGL 2 演示。(请注意,此演示目前仅限于桌面,移动支持即将推出。)在完全由您的 Web 浏览器运行的水、玻璃和钢的梦幻环境中漫步吧!

atf-0atf-1atf-3atf-4

如何使用 WebGL 2

要请求 WebGL 2 上下文,我们只需要从 <canvas> 元素中请求一个上下文。我们用来请求 WebGL 2 的字符串是“webgl2”。

let canvas = document.querySelector('canvas');
let ctx = canvas.getContext('webgl2');

WebGL 2 可能并非所有浏览器都支持,因此您应该包含一些后备代码。

let canvas = document.querySelector('canvas');
let ctx = canvas.getContext('webgl2');
let isWebGL2 = !!ctx;
if (!isWebGL2) { // try to fallback to webgl 1
    ctx = canvas.getContext('webgl') ||
          canvas.getContext('experimental-webgl');
}
if (!ctx) {
    console.log('your browser does not support WebGL');
}

警告…

请记住,虽然 WebGL 2 基于 OpenGL ES 3.0,但它并不完全相同。例如,WebGL 2 不支持程序二进制文件,OpenGL 中的一些可选限制对 WebGL 2 来说是强制性的。WebGL 2 规范 中列出了两者之间的区别,因此如果您已经熟悉 OpenGL,您将能够快速了解 WebGL 2。

还需要注意的是,WebGL 2 与 WebGL 1 并不完全向后兼容,因此您的 WebGL 1 代码在使用 WebGL 2 上下文时可能无法按预期工作。也就是说,差异非常小,您应该能够在无需太多麻烦的情况下移植您的代码和着色器。您可以在规范中阅读 向后不兼容列表,以及 WebGL2 Fundamentals 中的这份快速指南,了解如何从 WebGL 1 迁移代码到 WebGL 2。

请记住,虽然 WebGL 2 将为我们的许多用户带来这些新功能,但我们无法为使用旧版或过时显卡和驱动程序的用户提供 WebGL 2 支持。

突出显示的功能

更新的着色语言

WebGL 2 支持OpenGL ES 着色语言 3.0,它允许编写功能更强大、更有效的着色程序。新功能包括:

  • 真正的整数类型
  • 统一块
  • 在着色器源代码中绑定着色器输入和输出的位置索引
  • 片段丢弃
  • 动态循环
  • 复杂的纹理采样内置函数

多个渲染目标(“MRT”)

这允许您在一次传递中渲染到多个颜色缓冲区或纹理,使用片段着色器的多个输出。

此功能在 WebGL 1 中通过扩展启用,但现在已成为 WebGL 2 的核心功能集的一部分,因此您无需担心后备路径。

MRT 的主要应用之一是称为延迟着色的技术——我们以前在 Hacks 中已经写过它。它是一种渲染技术,允许在场景中使用大量动态灯光,因为渲染的复杂度并不取决于灯光数量,而取决于实际被照亮像素的数量。

实例化几何图形绘制

实例化允许您通过单个绘制调用渲染几何图形的多个实例,这减轻了 CPU 的负担。请注意,每个实例都可以有自己的属性,例如变换矩阵,因此您可以使用它来渲染许多相似的对象,例如粒子、森林中的树木、人群中的人等等。

以下 THREE.js 演示通过扩展使用实例化——请记住,在 WebGL 2 中不再需要扩展。
instanced-rendering

新的纹理功能

3D 或体积纹理是使用三个坐标而不是两个坐标(如常规的 2D 纹理)访问数据的纹理。这些纹理最常用于色调映射,但也可以用于渲染体积效果,例如烟雾、雾和光线。

2D 数组纹理包含一系列独立的 2D 图层,着色器可以索引这些图层以选择其中一个包含的 2D 纹理。

采样器对象 是 WebGL 2 中的新功能。它们将纹理采样的方式与用于采样的纹理分离,因此单个纹理可以以多种方式采样,多个纹理可以指向同一个采样器对象。

WebGL 2 还取消了对非 2 的幂(NPOT)纹理的限制。

变换反馈

变换反馈捕获顶点着色器的输出到缓冲区对象,通常使用此输出作为下一帧的输入。这创建了一个不离开 GPU 的循环,将这些计算的负担从 CPU 转移到 GPU。粒子系统通常利用变换反馈来迭代每个粒子的位置并在每一帧移动它,而无需 CPU 干预。

变换反馈也可以与“光栅器丢弃”结合使用,后者允许运行顶点着色器而不运行片段着色器。这允许进行自然的“映射”GPGPU(通用图形处理单元计算)数据处理流程。
transform-feedback

还有更多!

WebGL 2 中引入了更多功能,包括顶点数组对象、MSAA 渲染缓冲区和统一缓冲区块等等。要查看 WebGL 2 中所有新功能的完整列表,您可以查看官方规范,因为它只包含 WebGL 1 和 2 之间的差异。

WebGL 2 示例页面展示了一些功能的独立效果。这些针对特定功能的演示旨在说明新功能所能实现的效果,以及如何使用它们的示例代码。

下一步

我们今天发布了 API 以供广泛使用,但仍有更多工作要做。我们期待着在性能改进、放松一些限制以及改善整体质量方面开展工作。我们知道性能是您关注的重点,因此我们已经准备了一些激动人心的工作,以提供应用程序所需的性能,使其能够提供更加复杂和有影响力的体验。

除了看到应用程序添加 WebGL 2 支持之外,我们还期待着看到 WebGL 2 集成到现有的 WebGL 框架和引擎中。PlayCanvas 支持 WebGL 2,正如我们在After the Flood 的亮点中所展示的那样。 Three.js 也支持利用 WebGL 2。请关注其他引擎在今年晚些时候获得 WebGL 2 支持!

遇到问题?请在我们的 Bugzilla 上提交错误报告。(请记住:GitHub 登录信息也可以使用!)

关于 Jeff Gilbert

Jeff 领导 Firefox WebGL 开发,并且是 WebGL 规范的共同编辑。

Jeff Gilbert 的更多文章…

关于 Belén Albeza

Belén 是一位工程师和游戏开发者,在 Mozilla 开发者关系部门工作。她关心 Web 标准、高质量代码、可访问性和游戏开发。

Belén Albeza 的更多文章…


24 条评论

  1. Omar Shehata

    PlayCanvas 演示看起来很棒!这个项目公开了吗?我很想将其复制并看看它是如何制作的。

    2017 年 1 月 24 日 下午 09:32

    1. Joseph Peterson

      我也想复制这个项目。Web 上的 3D 技术越来越好。

      2017 年 1 月 24 日 下午 10:00

    2. Marco

      他们的博客中指出,他们需要进行一些重构才能使其公开访问。

      https://blog.playcanvas.com/mozilla-launches-webgl-2-with-playcanvas/

      2017 年 1 月 25 日 下午 12:04

  2. Andre Vrignaud

    PlayCanvas 正在准备发布这个演示——请关注他们的博客!

    2017 年 1 月 24 日 下午 10:59

  3. John

    当我测试它时,我并没有抱太大期望,但它真是太棒了!现在真是个美妙的时代:)

    2017 年 1 月 24 日 下午 19:40

  4. mkv

    在 Firefox 51.0 上

    “此演示需要 WebGL 2.0 支持。请更新到最新版本的 Mozilla Firefox。”

    ???

    2017 年 1 月 25 日 下午 11:46

    1. Jeff Gilbert

      如果您系统上有任何更新,您也可以尝试更新显卡驱动程序。

      2017 年 1 月 25 日 下午 1:19

    2. Olivier

      我遇到了同样的问题!我的 2009 款 iMac 没有发布任何图形卡驱动程序更新。看来我得卸载 Firefox 了……真是浪费时间!

      2017 年 1 月 26 日 下午 12:02

      1. Jeff Gilbert

        如果你提交一个包含你 about:support 页面“图形”部分的复制粘贴内容的错误报告,我们可以看一下!
        不幸的是,对于 2009 款 iMac,它可能太旧了,我们无法保证此时的行为正确。

        2017 年 2 月 8 日 下午 5:29

        1. Olivier

          我应该在哪里提交错误报告?

          2017 年 2 月 9 日 上午 6:04

        2. Olivier

          我已经提交了错误报告 1338147。

          这似乎是一个驱动程序问题。

          2017 年 2 月 9 日 上午 6:35

  5. Xuer

    请将 WebGL 包含在网站权限系统中,并允许我们将其设置为“询问使用”。

    任何与视频驱动程序密切相关的功能都应该可以禁用。

    感谢您对该功能的总体工作。

    2017 年 1 月 25 日 下午 3:24

    1. dand

      在他们添加类似功能之前,你可以使用 NoScript 扩展程序来选择性地允许 WebGL(以及许多其他有问题的功能)。

      2017 年 1 月 26 日 上午 7:26

  6. Daniel C. Henning

    升级到最新版 Firefox 后,当我尝试访问 After The Flood 链接时,进度条达到 100% 时,Firefox 每次都会强制退出。

    2017 年 1 月 25 日 下午 6:47

    1. Jeff Gilbert

      这听起来像这个错误
      https://bugzilla.mozilla.org/show_bug.cgi?id=1333534

      2017 年 1 月 27 日 下午 3:26

  7. clem

    为什么 WebGL 教程总是以 .getContext() 结束?

    2017 年 1 月 25 日 下午 7:26

    1. Jeff Gilbert

      如何使用 WebGL 本身超出了本文的范围。有很多其他网站可以详细学习如何使用 API,例如 https://webglfundamentals.org/

      2017 年 2 月 8 日 下午 5:27

  8. mkv

    感谢您的建议。
    我的驱动程序是来自 NVidia 的最新版本。
    至于“网站权限系统”——我在哪里可以找到它?

    2017 年 1 月 26 日 上午 5:32

  9. Martin Best

    Chrome 的最新版本已经发布,并且也包含 WebGL2。

    2017 年 1 月 26 日 下午 11:51

  10. wissing

    WebGL 在 Firefox 50 上运行良好,但是自从更新到 Firefox 51 后,我的 WebGL Web 应用程序不再显示任何内容。
    似乎所有 WebGL 功能现在都被切断了,如果显卡不支持 WebGL2。这太可惜了,对于那些没有像样显卡的用户来说,Firefox 51 迈入了一个很大的涅槃。

    2017 年 1 月 30 日 上午 6:08

    1. Jeff Gilbert

      太奇怪了!
      你能提交一个错误报告,并包含你 about:support 页面“图形”部分的复制粘贴内容吗?

      2017 年 2 月 8 日 下午 5:26

  11. Wellington Torrejais

    太棒了!

    2017 年 2 月 6 日 上午 7:58

  12. Muchlas Barkat

    Mozilla 最棒!

    2017 年 2 月 19 日 上午 4:19

  13. Rober Villar

    在支持 WebGL 但不支持 VR 的浏览器(例如 Firefox 51)和支持 WebGL 和 VR 两种功能的浏览器(例如 Nightly)之间存在差异。

    2017 年 2 月 19 日 下午 12:21

本文的评论已关闭。