Сначала я использовал свой собственный препроцессор #include
(очень просто сделать!)
Сделан шейкер-пустышка:
test.vert
#include test.vs
test.frag
#include test.fs
Это полусвратный хак, и вы определенно не хотите, чтобы он включался в svn / git / что угодно, если вы делитесь кодом, но замечательно, когда вам нужно изменить настройки при настройке.
По мере того, как все больше людей использовали несколько разных расширений файлов, я добавлял больше способов загрузки шейдеров.
LoadShader("MyShader", <List of preprocessors>)
LoadShader("vertex shader", "fragment shader", ... , <List of preprocessors>)
(здесь упрощенно. В действительности передается структура)
Первая функция будет делать следующее:
- Текстовые файлы с
[".vert",".vs".. etc]
для вершинного шейдера
- Текстовые файлы с
[".frag",".fs".. etc]
для фрагмента шейдера
- и т.д ..
Пользователь может определить, какие расширения файлов он хочет поддерживать.
Вторая функция просто использует точные имена файлов. В первой функции возможные комбинации ограничены препроцессорами. Во втором варианте вы можете комбинировать любой файл шейдера, который вам нужен, а также вносить изменения в препроцессоры.
Это, конечно, упрощенно, но показывает общую идею.