glslify 如何在模块之间共享结构

glslify how to share a struct between modules

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

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

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

JointAndPalette jointAndPalette = decodeJointAndPalette(inputProps);

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

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 文档中我不清楚如何构建这种依赖关系

编辑 - TLDR;

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

这意味着在文件中使用外部 variable/function/struct 之前,必须通过 require 命令导入包含该 variable/function/struct 的文件。

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

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

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

原回答:

我按照 github 页面中的描述在 CLI 模式下安装并 运行 glslify。

npm install -g npm
glslify index.glsl

其中 index.glsl 是您描述的 'vert shader'。输出显然是混乱的,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 假定不同编译单元中的相同名称的声明应该是唯一的实体,因此在组合输出中重命名它们,不会导致名称冲突。