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 假定不同编译单元中的相同名称的声明应该是唯一的实体,因此在组合输出中重命名它们,不会导致名称冲突。
我正在使用 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 假定不同编译单元中的相同名称的声明应该是唯一的实体,因此在组合输出中重命名它们,不会导致名称冲突。