我正在使用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)

encodeJointAndPalette看起来像:
JointAndPalette decodeJointAndPalette(float jointPaletteSplit) {
  // implementation

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

  return JandP;
}

#pragma glslify: export(decodeJointAndPalette)

从glslify文档对我来说还不清楚如何构造这种依赖关系

最佳答案

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

关于javascript - 详细说明如何在模块之间共享结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55621850/

10-11 11:36