Я пытаюсь открыть несколько шейдеров openGL в своем приложении на C++. Мое приложение разделено на два уровня абстракции: графический движок (который использует openGL) и фактическая логика приложения. Я хочу, чтобы графический движок был как можно более пригодным для вторичной переработки [1] (для других проектов).
Проблема в том, что если я определяю путь к файлу шейдера относительно (например, #define FOO_FRAG_SHADER "shaders/foo.frag"), программа не сможет его найти, поскольку этот каталог относится к пути графического движка, а не к пути приложения. По причине, указанной выше [1], я действительно не хочу указывать его каталог относительно каталога приложения, поскольку он становится зависимым от приложения.
Поэтому у меня вопрос: есть ли способ указать каталог относительно файла, который его определяет?
Относительные пути к каталогам относятся к рабочему каталогу программы, из которого вы его запускаете, а не к месту, где на самом деле находится исполняемый файл.





Относительные пути разрешаются относительно рабочий каталог процесса, который не обязательно является местоположением самого исполняемого файла. Например, если вы запустите свою программу вот так
/user/oier/bin/> ./a.out
тогда относительные пути разрешаются относительно /user/oier/bin. Однако, если вы начнете так
/user/oier/> bin/a.out
тогда относительные пути разрешаются относительно /user/oier.
Есть два распространенных подхода к решению этой проблемы без жесткого программирования расположения ваших файлов:
Если файлы, о которых идет речь, небольшие, и есть вероятность, что каждое приложение может захотеть предоставить его частную копию, третий подход состоит в том, чтобы скопировать соответствующие файлы в папку в bin вашего приложения и использовать относительную ссылку на основе о местонахождении копии.
Посмотрим, правильно ли я понял ваше решение (второе выглядит разумным). Я посмотрел, как ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ работают в C++. Итак, перед выполнением кода мне нужно установить переменную среды, указывающую путь шейдеров. Например: user@mySystem:$ FOO_APP_SHADERS=whatever/someotherdir/shaders, тогда мне нужно запросить его на моем графическом движке с getenv(), чтобы, добавив в конце "/foo.frag", я мог получить доступ к файлу
Если переменная среды не задана, вам может потребоваться резервный путь по умолчанию.
@oierlauzi Верно, это подход. Большинство систем позволяют вам определять переменные среды как часть своего рода сценария запуска для каждого пользователя / системы, поэтому вам придется настроить FOO_APP_SHADERS один раз во время установки вашей библиотеки.