Как разделить структуру между модулями - PullRequest
7 голосов
/ 11 апреля 2019

Я использую https://github.com/glslify/glslify для обмена кодом между шейдерами glsl.

У меня есть вертолетный шейдер, который пытается включить модуль в вершину, которую имеет верт:

#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 Ответ

2 голосов
/ 23 апреля 2019

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 предполагает, что объявления с одним и тем же именем в разных единицах компиляции должны быть уникальными объектами, и поэтому переименовывает их в комбинированном выводе, чтобы не вызывать конфликт имен.

...