资产路径:绝对与生成
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&
作为参数。
我目前正在制作一个 "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&
作为参数。