Подтвердить что ты не робот

Внешнее определение макросов препроцессора в GLSL

GLSL имеет полный препроцессор C-стиля. Единственное, что не работает, - #include. Одна из замечательных особенностей заключается в том, что вы можете использовать #ifdef для комментирования функций и, таким образом, создать один шейдер, который может быть разрежен, если некоторые функции не используются.

Мой вопрос:

Есть ли способ определить макрос из кода C?

Кажется, нет никакого способа сделать это с интерфейсом openGL. Быстрый взлом - это добавить несколько строк С#define FOO до загрузки файла формы. Но это похоже на обратную сторону.

4b9b3361

Ответ 1

Вам не нужно добавлять его к загруженному вами коду. Вот почему в glShaderSourceARB API есть несколько строк.

Что-то вроде следующего делает то, что вы ищете:

char *sources[2] = { "#define FOO\n", sourceFromFile };
glShaderSourceARB(shader, 2, sources, NULL);

Ответ 2

Вот что я использую, чтобы избежать проблем #version. Это Java и не оптимизирован для perfo, но он отлично работает:

// extract shader sourcecode from file
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url);

// apply defined values
int versionIndex = shaderSource.indexOf("#version");
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name());
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1;

for (int i = defined.size() - 1; i >= 0; --i)
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n");