Встраивание cg-шейдеров в библиотеку C ++ GPGPU - PullRequest
1 голос
/ 21 марта 2010

Я пишу симулятор GPGPU Fluid, который работает с использованием C ++ / OpenGL / Cg.На данный момент библиотека требует, чтобы пользователь указал путь к шейдерам, который затем будет читать его из.

Я нахожу крайне раздражающим указывать это в моих собственных проектах и ​​тестировании,поэтому я хочу связать содержимое шейдера с остальными.

В идеале мои файлы .cg по-прежнему будут доступны для просмотра отдельно, но шаг после сборки или директива препроцессора включат его в источник, когдатребуется.

Чтобы сделать вещи немного более раздражающими, у меня есть файл шейдера "utils", который содержит функции, которые совместно используются (например, преобразование координат трехмерной текстуры в эквивалент 2d-атласа).* Я хотел бы, чтобы это решение было кросс-платформенным, если это возможно, но оно не так уж важно, так как в настоящее время оно доступно только для Windows.Мои поиски действительно только показали objcopy для linux, но использование этого для окон не идеально.

Если это поможет, проект доступен на http://code.google.com/p/fluidic

1 Ответ

0 голосов
/ 22 марта 2010

Вы имеете в виду, что вы хотите, чтобы шейдеры были встроены как строки в ваш двоичный файл? Мне не известны какие-либо кроссплатформенные инструменты / библиотеки для этого, что неудивительно, потому что двоичные файлы будут разных форматов.

Для Windows звучит так, как будто вы хотите сохранить их как строковый ресурс . Затем вы можете прочитать строку, используя LoadString(). Вот как их добавить , но вы не можете связать их с файлом.

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

т.е. у вас есть файл myshader.shader, который содержит:

int aFunction(int i, int j)
{
   return i/j;
}

И у вас есть шаг сборки, который создает файл myshader.shader.h, который выглядит следующим образом:

const char[] MYSHADER_SHADER =
"int aFunction(int i, int j)"
"{"
"   return i/j;"
"}";

Затем добавьте #include "myshader.shader.h" к вашему коду.

Очень хакерский, но я не вижу причин, почему это не сработало (за исключением, возможно, ограничений длины / пространства для строковых литералов).

Обновление: с выпуском G ++ 4.5 он поддерживает необработанные строковые литералы C ++ 0x. Они могут содержать новые строки 4 . Я не проверял это, но вы должны быть в состоянии сделать что-то вроде этого:

const char[] MY_SHADER = R"qazwsx[
#include "my_shader.c"
]qazwsx";

Я еще не проверял это.

...