Внешнее определение макросов препроцессора в GLSL - PullRequest
22 голосов
/ 04 марта 2010

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

Мой вопрос:

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

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

Ответы [ 2 ]

25 голосов
/ 04 марта 2010

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

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

char *sources[2] = { "#define FOO\n", sourceFromFile };
glShaderSourceARB(shader, 2, sources, NULL);
8 голосов
/ 23 октября 2013

Вот что я использую, чтобы избежать проблем #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");
...