资产路径:绝对与生成

Assets path : absolute vs generated

我目前正在制作一个 "fromAssets" 函数,该函数提供程序执行时所在资产文件夹的路径。

函数来自以下部分代码

头文件:

#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

namespace path {
    static fs::path BUILD_PATH;
    const void initialiseBuildPath(const char *argv);
    const char * fromAssets(const char * path);
}

源文件:

using namespace path;

const void path::initialiseBuildPath(const char *argv0) {
    BUILD_PATH = fs::initial_path<fs::path>();
    BUILD_PATH = fs::system_complete(fs::path(argv0))
                            .parent_path()
                            .parent_path();
}

const char * path::fromAssets(const char * path) {
    std::string strPath = std::string(path);
    return (BUILD_PATH.string() + "/assets/" + strPath).c_str();
}

使用:

const char * absolute = "/Users/thomaspetillot/CLionProjects/glDiscoverProject/build/assets/shader/basic.vert.glsl";
const char * generated = path::fromAssets("shader/basic.vert.glsl");
cout << strcmp(absolute, generated) << endl; // show 0



// Work
auto * shader = new Shader(absolute,
                           path::fromAssets("shader/basic.frag.glsl"));

// Doesn't work
auto * shader = new Shader(generated,
                           path::fromAssets("shader/basic.frag.glsl"));

文件夹结构:

build
├── assets
│   ├── img
│   │   ├── pepe.jpg
│   │   └── snoop.jpg
│   └── shader
│       ├── basic.frag.glsl
│       └── basic.vert.glsl
└── bin
    └── program

为什么它只适用于片段着色器而不适用于其他着色器?

fromAssets 方法 return 是指向无效内存地址的指针。发生这种情况是因为您 return c_str() 对象的 std::string 指针是该函数的局部变量。当函数 returns 时,包括 std::string 在内的所有局部变量都被删除,指针 returned 指向不再存在的内存地址。

最好(也是最现代)的修复方法是 return std::string 对象本身而不是 const char* 指针。您可以将 c_str 指针传递给着色器构造函数,或者更好地调整构造函数以将 const std::string& 作为参数。