资产路径:绝对与生成

时间:2017-11-15 19:07:16

标签: c++ opengl assets

我目前在制作" 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

如何为frag着色器而不是为另一个着色器工作?

1 个答案:

答案 0 :(得分:1)

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

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