GLSL to SPIR-Vのランタイムコンパイルにおけるinclude directiveがよく分からなかったので自前で置換してしまった


GLSL to SPIR-Vのランタイムコンパイルを

  • glslang
  • shaderc

の2つで試してみたのですが、include directiveを含むとうまく動かせませんでした。しっかり動く方法解説をどなたか...

置換する

とりあえず今回は include directive をコンパイル前に自前で置換してしまいました。

コードは以下です。std::regexstd::string::replaceなどを使い、単純にループを回してすべての#includeを処理します。

std::string include(const std::string& filepath, const std::string& sourceText)
{
    using std::filesystem::path;
    path dir = path{ filepath }.parent_path();

    std::string included = sourceText;
    std::regex regex{ "#include \"(.*)\"" };
    std::smatch results;
    while (std::regex_search(included, results, regex)) {
        path includePath = dir / results[1].str();
        std::string includeText = ReadFile(includePath.string());
        included.replace(results.position(), results.length(), includeText);
    }
    return included;
}