我正在进行一个Xcode项目,该项目将渲染与Metal和OpenGL进行比较。
它被分为两个不同的目标,因此Metal部分在Swift中,OpenGL部分在C++中。
我制作了一个用于模型加载的C++类,供他们两个访问。OpenGL(C++(部分直接访问它,Metal部分有一些Objetice-C++代码可以桥接,因此它可以与Swift配合使用。ModelLoader构造函数看起来像这样:
ModelLoader(const char* modelPath)
{
fstream modelFileStream(modelPath);
string line;
if (modelFileStream.is_open())
{
while (getline(modelFileStream, line))
{
// obj parsing
}
modelFileStream.close();
}
else
{
cout << "Failed to open model file at path: " << modelPathString << endl;
}
}
问题是,当我直接在OpenGL(C++(目标上使用它时,它工作得很好,但当我在Metal(Swift(目标中使用时,它无法成功打开文件并打印";无法打开路径为(参数中使用的路径("的模型文件;。
我已经尝试过使用相对路径(通过编辑方案>使用自定义工作目录(和绝对路径。两者都适用于OpenGL版本,但不适用于Metal版本。还尝试在ModelLoader构造函数上直接对路径进行硬编码,但一无所获。
与Objective-C++的桥接似乎也很好,因为它打印了消息。打印在两个目标中的路径完全相同,因此这不是桥接完成的。
那到底发生了什么?
禁用"应用程序沙盒";在权益方面解决了这一问题。