我正在使用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文档中我还不清楚如何构造这种依赖关系
答案 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假定在不同编译单元中具有相同名称的声明应该是唯一的实体,因此在组合输出中将其重命名,不会引起名称冲突。