【问题标题】:glslify how to share a struct between modulesglslify 如何在模块之间共享结构
【发布时间】:2020-08-13 02:58:28
【问题描述】:

我正在使用https://github.com/glslify/glslify 在 glsl 着色器之间共享代码。

我有一个顶点着色器,它试图在顶点的顶部包含一个模块:

#pragma glslify: JointAndPalette = require('./JointAndPalette.glsl');
#pragma glslify: decodeJointAndPalette = require('./decodeJointAndPalette.glsl');

JointAndPalette jointAndPalette = decodeJointAndPalette(inputProps);

decodeJointAndPalette 也依赖于 JointAndPalette 结构作为其返回定义

JointAndPalette 看起来像:

struct JointAndPalette
{
  int jointId;
  int paletteId;
};

#pragma glslify: export(JointAndPalette)

decodeJointAndPalette 看起来像:

JointAndPalette decodeJointAndPalette(float jointPaletteSplit) {
  // implementation

  JointAndPalette JandP;
  JandP.jointId = int(x);
  JandP.paletteId = int(y);

  return JandP;
}

#pragma glslify: export(decodeJointAndPalette)

从 glslify 文档中我不清楚如何构建这种依赖关系

【问题讨论】:

    标签: javascript glsl webgl glslify


    【解决方案1】:

    编辑 - TLDR;

    glsify 分别评估每个文件,如果在多个文件中遇到相同的变量/函数/结构名称,则 glslify 假定对象是本地的,并重命名它们以避免名称冲突。

    这意味着在文件中使用外部变量/函数/结构之前,必须通过 require 命令导入包含该变量/函数/结构的文件。

    在您的特定情况下,这意味着添加行

    #pragma glslify: JointAndPalette = require('./JointAndPalette.glsl');
    

    到文件decodeJointAndPalette.glsl,同时还在顶点着色器的顶部保留相同的require语句。

    原答案:

    我按照 github 页面上的说明在 CLI 模式下安装并运行了 glslify。

    npm install -g npm
    glslify index.glsl
    

    index.glsl 是您所说的“垂直着色器”。输出明显混淆了,glslify 似乎认为JointAndPalette 有多个定义,并给他们一个_0_1 后缀。

    #define GLSLIFY 1
    struct JointAndPalette_0
    {
      int jointId;
      int paletteId;
    };
    
    JointAndPalette_1 decodeJointAndPalette(float jointPaletteSplit) {
      // implementation
    
      JointAndPalette_1 JandP;
      JandP.jointId = int(x);
      JandP.paletteId = int(y);
    
      return JandP;
    }
    
    JointAndPalette_0 jointAndPalette = decodeJointAndPalette(inputProps);
    

    因此尝试修改decodeJointAndPalette.glsl,使其也导入JointAndPalette.glsl

    #pragma glslify: JointAndPalette = require('./JointAndPalette.glsl');
    JointAndPalette decodeJointAndPalette(float jointPaletteSplit) {
      // implementation
    
      JointAndPalette JandP;
      JandP.jointId = int(x);
      JandP.paletteId = int(y);
    
      return JandP;
    }
    
    #pragma glslify: export(decodeJointAndPalette)
    

    现在glslify index.glsl 使用修改后的decodeJointAndPalette.glsl 的输出不再包含_0_1 后缀。

    #define GLSLIFY 1
    struct JointAndPalette
    {
      int jointId;
      int paletteId;
    };
    
    JointAndPalette decodeJointAndPalette(float jointPaletteSplit) {
      // implementation
    
      JointAndPalette JandP;
      JandP.jointId = int(x);
      JandP.paletteId = int(y);
    
      return JandP;
    }
    
    JointAndPalette jointAndPalette = decodeJointAndPalette(inputProps);
    

    这对我来说是正确的。并且逻辑似乎是 glsilify 假定在不同编译单元中的相同名称的声明应该是唯一的实体,因此在组合输出中重命名它们,而不是导致名称冲突。

    【讨论】:

    • 为了澄清您在index.glsl 的顶部留下了双重#pragma 要求?并在decodeJointAndPalette.glsl 中添加了#pragma 要求?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2016-04-14
    • 2015-10-28
    • 2018-02-23
    • 2019-09-19
    相关资源
    最近更新 更多