Edit - TLDR;
glsify оценивает каждый файл отдельно, и если одна и та же переменная / функция / имя структуры встречается в нескольких файлах, glslify предполагает, что объекты являются локальными, и переименовываетих, чтобы избежать конфликтов имен.
Это означает, что перед тем, как внешняя переменная / функция / структура может использоваться в файле, файл, содержащий эту переменную / функцию / структуру, должен быть импортирован командой require.
В вашем конкретном случаеВ этом случае это означает добавление строки
#pragma glslify: JointAndPalette = require('./JointAndPalette.glsl');
в файл decodeJointAndPalette.glsl
, в то же время сохраняя тот же оператор require в верхней части вершинного шейдера.
Исходный ответ:
Я установил и запустил glslify в режиме CLI, как описано на странице github.
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 предполагает, что объявления с одним и тем же именем в разных единицах компиляции должны быть уникальными объектами, и поэтому переименовывает их в комбинированном выводе, чтобы не вызывать конфликт имен.