使用 Firefox 开发者工具实时编辑 WebGL 着色器

如果你看过 Epic Games 的 Epic Citadel HTML5 版本,你一定对它惊人的性能和细节水平印象深刻。屏幕上看到的许多酷炫视觉效果的代码都是以**着色器**的形式编写的,它们通过**程序**链接在一起。这些程序是直接在 GPU 上执行的专门程序,用于提供高性能的实时视觉效果。

即使你使用的是库,编写顶点和片段着色器也是 Web 上 3D 开发的重要组成部分。事实上,Epic Citadel 演示 包含了 200 多个着色器程序。这是因为大多数渲染都是根据游戏需求进行定制和优化的。当前,着色器开发存在以下几个问题:

  • 查看更改需要刷新页面
  • 某些着色器在非常具体的条件下才会应用

这是一个屏幕截图,展示了如何使用一个相对简单的 WebGL 演示来操作着色器代码。

从 Firefox 27 开始,我们引入了一个名为“着色器编辑器”的新工具,它使得使用着色器程序变得更加简单:编辑器列出了 WebGL 上下文中运行的所有着色器程序,你可以实时编辑着色器并立即看到结果,而不会中断任何动画或状态。此外,编辑着色器**不会**影响 WebGL 性能。

启用着色器编辑器

着色器编辑器默认情况下不会显示,因为并非所有网页都包含 WebGL,但你可以轻松地启用它。

  1. 通过按 F12 或 Ctrl/Cmd + Shift + I 打开工具箱。
  2. 单击工具箱顶部边缘附近的“齿轮”图标,打开“工具箱选项”。
  3. 在左侧的“默认 Firefox 开发者工具”下,确保选中“着色器编辑器”。你应该立即看到一个新的“着色器编辑器”工具选项卡。

使用着色器编辑器

要查看着色器编辑器在运行时的效果,只需访问一个 WebGL 演示,例如这个,然后打开工具箱。当你单击着色器编辑器选项卡时,你会看到一个“重新加载”按钮,需要单击它才能将编辑器连接到 WebGL 上下文。完成此操作后,你会看到着色器编辑器 UI。

The WebGL Shader Editor

  • 在左侧,你有一个程序列表,每个程序对应一个顶点和片段着色器,它们的源代码在右侧的编辑器中显示并带有语法高亮显示。
  • 着色器类型显示在每个编辑器的下方。
  • 将鼠标悬停在程序上会以红色突出显示由其对应的着色器绘制的几何图形,这对于查找要处理的正确程序很有用。
  • 单击每个程序旁边的眼睛图标会隐藏渲染的几何图形(如果作者只想专注于某些几何图形而不是其他几何图形,或者隐藏重叠的几何图形,这会很有用)。
  • 该工具在停靠在侧面时具有响应性。

编辑着色器程序

你首先会注意到着色器程序代码**不是** JavaScript。有关着色器程序工作原理的更多信息,我强烈建议你从Khronos wiki 上的 WebGL 演示开始,或者阅读 Paul Lewis 优秀的HTML5 Rocks 文章Learning WebGL 博客上也有一些很棒的长期教程。着色器编辑器让你可以直接访问这些程序,以便你可以尝试它们的工作原理。

  • 在任何编辑器中编辑代码都会编译源代码并在用户停止输入后立即应用它;
  • 如果代码中存在错误,渲染不会受到影响,但编辑器中会显示错误,并突出显示有问题的代码行;将鼠标悬停在图标区域将显示一个描述错误的工具提示。

Errors in shaders

Mozilla 开发者网络 上了解更多关于着色器编辑器的信息。

这是一个第二个屏幕截图,展示了如何直接编辑 Epic Citadel 演示中的着色器程序。

关于 Victor Porof

Mozilla 成员,黑客,在 Firefox DevTools 上工作。

Victor Porof 的更多文章……

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道者和编辑。发表演讲和博客,主题包括 HTML5、JavaScript 和开放网络。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直在从事 Web 前端开发工作 - 在瑞典和纽约市。他还经常在 http://robertnyman.com 上写博客,喜欢旅行和结识新朋友。

Robert Nyman [荣誉编辑] 的更多文章……


17 条评论

  1. kris

    Victor 的脸看起来很像 Opera 的 Chris :)

    2013 年 11 月 12 日 下午 10:59

    1. Jsx

      Chris 现在在 Mozilla o_O

      2013 年 11 月 13 日 上午 04:28

  2. Aras

    感谢此更新,着色器编辑器看起来非常有用,也很酷!在开发者工具中拥有这个选项非常有意义。我不知道这是否可行,但我很好奇,是否有可能有一种自动模式,在页面包含 WebGL 时添加着色器选项卡,而在页面不包含 WebGL 时将其删除?我认为这是一个很酷的功能,并且这种操作的 UX 可能可以重复用于仅适用于特定应用程序/页面组的类似工具。

    2013 年 11 月 12 日 下午 11:20

    1. Victor Porof

      这确实很有道理。我们会研究默认情况下在包含 WebGL 内容的页面上显示该选项卡。

      2013 年 11 月 12 日 下午 11:23

  3. foxtrot

    很棒。现在我正在等待 CSS 着色器!
    请让它成为现实,伙计们。

    2013 年 11 月 12 日 下午 11:30

    1. Dusan Bosnjak

      CSS 着色器是什么?

      2013 年 11 月 14 日 下午 15:48

      1. foxtrot

        这个想法是将顶点和片段着色器用作自定义 CSS 过滤器。
        请参阅此处:http://www.adobe.com/devnet/html5/articles/css-shaders.html#articlecontentAdobe_numberedheader_0

        2013 年 11 月 15 日 下午 13:28

  4. Andy

    这太棒了!OpenGL 是否提供着色器编译错误,还是你们自己编写了语法检查/解析?

    2013 年 11 月 12 日 下午 14:03

    1. Victor Porof

      编译错误由驱动程序提供。请参阅http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetShaderInfoLog.xml

      2013 年 11 月 13 日 上午 00:10

      1. Benoit Jacob

        事实上,它们更常由 ANGLE 着色器编译器提供(在大多数情况下),这是我们在所有平台上用于验证着色器并将它们从 WebGL 的 GLSL 方言转换为常规 GLSL(或 Windows 上的 HLSL)的工具。

        2013 年 11 月 14 日 下午 12:40

  5. pd

    很高兴看到 DevTools 开拓新领域并补充 Firebug。

    2013 年 11 月 13 日 上午 11:06

  6. Luke

    哇!无论采用哪种绘制方法(asm.js 库、ThreeJS 等),它都能正常工作吗?

    2013 年 11 月 13 日 下午 20:43

    1. Victor Porof

      此工具应该适用于所有 WebGL 内容。

      2013 年 11 月 14 日 上午 03:25

  7. Patrick Cozzi

    这里的工作很棒。我在我们的引擎上尝试了这个,我很高兴它适用于真正的应用程序,而不仅仅是演示。

    一些可以使它变得更好的功能想法
    * 将计算结果为真的 #ifdef 块中的代码加粗。
    * 将鼠标悬停在像素上,显示使用的着色器。将鼠标悬停在像素上,显示片段着色器的配置文件。没问题吧?
    * 一个选项,只显示帧中使用的着色器,而不是 WebGL 上下文中的所有着色器,因为许多着色器可能用于剔除的对象。更进一步,可以通过只显示非遮挡片段的着色器来更清晰地显示。

    2013 年 11 月 16 日 下午 20:16

  8. makc

    因此,这个工具很棒,每个人都赞赏它,非常酷,谢谢。

    现在让我直接跳到不好的地方……我不知道是否在任何地方都提到了这一点,但目前编辑器中没有任何东西可以显示哪些 #ifdef 是活动的。例如,如果我尝试打开任何 threejs 演示,我有很多条件,而且并不立即清楚特定代码是否处于活动状态。我需要向上查看每个条件,并将其与顶部的 #define 进行比较。这太糟糕了 :) 可以做些什么吗?也许只是像注释一样将着色器的非活动部分以灰色显示?任何解决这个问题的方案都会使它变得完美!

    2013 年 11 月 21 日 上午 10:56

    1. Victor Porof

      应该可以删除未使用的代码,类似于 unifdef 的工作方式:http://dotat.at/prog/unifdef/

      已提交此错误:https://bugzilla.mozilla.org/show_bug.cgi?id=942855 如果你有时间,请随意贡献 :)

      2013 年 11 月 25 日 上午 08:53

      1. makc

        是的,这也是一个不错的选择。因为我猜想着色器不会直接从着色器编辑器复制粘贴,只会手动编辑其中的特定部分。

        2013年11月25日 下午09:18

本文评论已关闭。