OpenGL / GLSL - использование glShaderSource с несколькими источниками для поддержки включаемых файлов - PullRequest
5 голосов
/ 02 августа 2011

Поскольку в GLSL нет опции include-file, я пытаюсь добавить это с помощью парсера "#pragma include".(Я хочу этого, потому что у меня есть несколько общих методов, которые я хотел бы реализовать только один раз, но мог бы использовать во многих различных шейдерах, например, сглаживающий шаг Кена Перлина)

Парсинг файлов шейдеров для получения включенных файлов работает нормально.Но при настройке ShaderSource с несколькими исходными файлами я всегда сталкиваюсь с проблемами;Поскольку мой основной шейдер обычно начинается с "#version 330", а строка # version всегда должна быть первой строкой в ​​шейдере, я могу добавить свой основной файл только в качестве первой в массиве строк, переданных glShadersource, и послечто все включенные файлы.Но тогда мой основной файл не может использовать никакие функции, реализованные в этих включенных файлах, так как они будут по существу объединены после моего основного файла, поэтому компилятор жалуется, что не знает функций, которыми является мой основной файлиспользование.

Единственный способ заставить его работать - это прочитать основной файл, разобрать прагму include, а затем заменить эту строку прагмы содержимым файла:включаемый файл (рекурсивное применение этого же метода ко всем включенным файлам, которые могут включать в себя и другие файлы), но это будет означать, что числа белья в ошибках компиляции больше не будут соответствовать реальным номерам белья основного файла.

Кто-нибудь установил какую-то функцию «включения» для GLSL, которая работает И сохраняет белья?И если так - как?

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

Как насчет анализа тега #version и создания этой отдельной (и первой) исходной строки?Таким образом, вы также можете иметь разные теги версий во включениях (в зависимости от требований к их функциям) и просто уменьшить их до одного тега версии (с самым большим номером версии).

2 голосов
/ 09 августа 2011

Прежде всего, существует директива препроцессора #line, которая устанавливает текущую исходную строку, сообщаемую в сообщениях об ошибках компилятора.Используя эту директиву препроцессора, вы можете упростить включение строк внешнего источника.Это должно решить вашу проблему.

Кроме того, я прочитал расширение shading_language_include , которое должно помочь вам поддерживать функциональные возможности "include".Если ваш драйвер не реализовал его, вы все равно могли бы поддерживать синтаксис, представленный расширением, поэтому вы можете изящно поддерживать шейдеры, требующие этого расширения.

0 голосов
/ 09 августа 2011

Если ваши шейдеры находятся в файлах, вы можете использовать cpp (или gcc -E) для их обработки (и работы с любыми директивами #include) перед передачей их в openGL. Вы можете даже что-то вроде popen("cpp -P main.glsl", "r") прочитать и предварительно обработать ваш шейдер ...

...