npm 包 glsl-parser 使用教程

阅读时长 19 分钟读完

简介

glsl-parser 是一款用于解析 GLSL 代码的 npm 包。GLSL(OpenGL Shading Language)是一种用于 OpenGL ES 渲染管道中的顶点和像素着色器的 C 风格语言。该 npm 包可以让开发者将 GLSL 代码转换为 JavaScript 对象表示形式,方便在前端领域中利用。

安装

在使用该包之前,需要先安装 Node.js 环境。在 Node.js 环境下,在命令行中输入以下命令进行安装:

使用

引入 glsl-parser 包:

将 GLSL 代码转换为 JavaScript 对象:

-- -------------------- ---- -------
----- -------- - -
  --------- ----- ------
  --------- ---- ---------
  ------- ---- -----------------
  ------- ---- -----------
  ------- ---- ------------
  ---- ------ -
    ----------- - ---------------- - ---------- - ----------- - -------------- -----
  -
--

----- ------------ - ---------------------------

此时,shaderObject 就是一个 JavaScript 对象,它的结构与 GLSL 代码对应的 AST(抽象语法树)结构一致。

深入

AST(抽象语法树)

glsl-parser 输出的 JavaScript 对象是一个代表 AST 的根节点对象。该对象具有以下属性:

  • type: string - 节点类型。例如:identifier, binary, ifStatement。
  • loc: SourceLocation - 节点所在位置。
  • range: Array.<number> - 包含节点范围的数组。
  • comments: Array.<string> - 与节点相关的注释。
  • leadingComments: Array.<string> - 与节点前置空白行相关的注释。
  • trailingComments: Array.<string> - 与节点结束位置之后的空白行相关的注释。

除了根节点外的节点也具有以下属性:

  • type: 和父节点相同。

其中,type 属性用于标识节点类型,其具体取值如下:

  • identifier: 标识符
  • literal: 字面量,例如:数字、字符串、布尔值等。
  • binary: 二元运算符
  • unary: 一元运算符
  • array: 数组
  • member: 成员访问,例如:object.property
  • assignment: 赋值运算
  • ifStatement: if 语句
  • blockStatement: 块语句
  • expressionStatement: 表达式语句
  • variableDeclaration: 变量声明
  • variableDeclarator: 变量声明符
  • functionDeclaration: 函数声明
  • returnStatement: return 语句
  • callExpression: 函数调用

示例

以 GLSL 中常见的向量加法运算为例,该运算符在 GLSL 中的表示为:

使用 glsl-parser 将 GLSL 代码解析为 AST,其结果如下:

-- -------------------- ---- -------
-
  ------- ----------
  ------ -
    -------- -
      ------- --
      --------- -
    --
    ------ -
      ------- --
      --------- -
    -
  --
  -------- -
    --
    --
  --
  ------- -
    -
      ------- ----------------------
      --------------- -
        -
          ------- ---------------------
          ----- -
            ------- -------------
            ------- ----
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- -
              -
            --
            -------- -
              --
              -
            -
          --
          ------- -
            ------- -----------------
            --------- -
              ------- -------------
              ------- -------
              ------ -
                -------- -
                  ------- --
                  --------- -
                --
                ------ -
                  ------- --
                  --------- --
                -
              --
              -------- -
                --
                --
              -
            --
            ------------ -
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              --
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              --
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              -
            --
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- --
              -
            --
            -------- -
              --
              --
            -
          --
          ------ -
            -------- -
              ------- --
              --------- -
            --
            ------ -
              ------- --
              --------- --
            -
          --
          -------- -
            --
            --
          -
        -
      --
      ------- ------
      ------ -
        -------- -
          ------- --
          --------- -
        --
        ------ -
          ------- --
          --------- --
        -
      --
      -------- -
        --
        --
      -
    --
    -
      ------- ----------------------
      --------------- -
        -
          ------- ---------------------
          ----- -
            ------- -------------
            ------- ----
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- -
              -
            --
            -------- -
              ---
              --
            -
          --
          ------- -
            ------- -----------------
            --------- -
              ------- -------------
              ------- -------
              ------ -
                -------- -
                  ------- --
                  --------- -
                --
                ------ -
                  ------- --
                  --------- --
                -
              --
              -------- -
                ---
                --
              -
            --
            ------------ -
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              --
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              --
              -
                ------- ----------
                -------- --
                ------ ------
                ------ -
                  -------- -
                    ------- --
                    --------- --
                  --
                  ------ -
                    ------- --
                    --------- --
                  -
                --
                -------- -
                  ---
                  --
                -
              -
            --
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- --
              -
            --
            -------- -
              ---
              --
            -
          --
          ------ -
            -------- -
              ------- --
              --------- -
            --
            ------ -
              ------- --
              --------- --
            -
          --
          -------- -
            ---
            --
          -
        -
      --
      ------- ------
      ------ -
        -------- -
          ------- --
          --------- -
        --
        ------ -
          ------- --
          --------- --
        -
      --
      -------- -
        ---
        --
      -
    --
    -
      ------- ----------------------
      --------------- -
        -
          ------- ---------------------
          ----- -
            ------- -------------
            ------- ----
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- -
              -
            --
            -------- -
              ---
              --
            -
          --
          ------- -
            ------- ---------
            ----------- ----
            ------- -
              ------- -------------
              ------- ----
              ------ -
                -------- -
                  ------- --
                  --------- -
                --
                ------ -
                  ------- --
                  --------- -
                -
              --
              -------- -
                ---
                --
              -
            --
            -------- -
              ------- -------------
              ------- ----
              ------ -
                -------- -
                  ------- --
                  --------- --
                --
                ------ -
                  ------- --
                  --------- --
                -
              --
              -------- -
                ---
                --
              -
            --
            ------ -
              -------- -
                ------- --
                --------- -
              --
              ------ -
                ------- --
                --------- --
              -
            --
            -------- -
              ---
              --
            -
          --
          ------ -
            -------- -
              ------- --
              --------- -
            --
            ------ -
              ------- --
              --------- --
            -
          --
          -------- -
            ---
            --
          -
        -
      --
      ------- ------
      ------ -
        -------- -
          ------- --
          --------- -
        --
        ------ -
          ------- --
          --------- --
        -
      --
      -------- -
        ---
        --
      -
    -
  --
  ------------- --------
-

可以通过该对象找到 GLSL 中相应的节点:

  • a 节点:declarations[0].init
  • b 节点:declarations[1].init
  • c 节点:declarations[2].init

其中,a、b 节点的 init 属性都是一个类型为 callExpression 的节点,表示对 vec3 构造函数的调用。该节点的 arguments 属性为一个类型为 literal 的数组,包含了向量的各个分量。c 节点的 init 属性是一个类型为 binary 的节点,表示加法运算符的左右操作数。

总结

glsl-parser 是一款解析 GLSL 代码的 npm 包,可以将 GLSL 代码转换为 JavaScript 对象表示形式,方便在前端领域中利用。通过对 glsl-parser 输出对象的分析,可以更好地理解 GLSL 代码的结构,并进一步进行相关的开发和应用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f532f3f8250f93ef890045b

纠错
反馈