详细说明如何在模块之间共享结构

时间:2019-04-10 21:54:29

标签: javascript glsl webgl glslify

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

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

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

1 个答案:

答案 0 :(得分:2)

编辑-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假定在不同编译单元中具有相同名称的声明应该是唯一的实体,因此在组合输出中将其重命名,不会引起名称冲突。