【发布时间】:2020-11-29 16:44:52
【问题描述】:
我正在开发 Visual Studio 中的解决方案。它目前有两个项目。
我将用大写字母表示目录或文件夹,文件名将全部小写。我的解决方案结构如下:
- 解决方案目录
- 项目库
- 源文件
- 着色器
- 着色器文件
- 项目应用程序
- 源文件
- x64
- 调试
- app.exe // 调试构建
- 发布
- app.exe // 发布版本
- 调试
- 项目库
在ProjectLib 内,我有一个打开和读取我的着色器文件的功能。这是我的函数的样子:
std::vector<char> VRXShader::readFile(std::string_view shadername) {
std::string filename = std::string("Shaders/");
filename.append(shadername);
std::ifstream file(filename.data(), std::ios::ate | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("failed to open file!");
}
size_t fileSize = static_cast<size_t>(file.tellg());
std::vector<char> buffer(fileSize);
file.seekg(0);
file.read(buffer.data(), fileSize);
file.close();
return buffer;
}
这个函数在我的VRXDevices::createPipeline 函数中被调用,这里是相关代码:
void VRXDevices::createPipeline(
VkDevice device, VkExtent2D swapChainExtent, VkRenderPass renderPass,
const std::vector<std::string_view>& shaderNames,
VkPipelineLayout& pipelineLayout, VkPipeline& pipeline
) {
std::vector<std::vector<char>> shaderCodes;
shaderCodes.resize(shaderNames.size());
for (auto& name : shaderNames) {
auto shaderCode = VRXShader::readFile(name.data());
}
// .... more code
}
正在创建名称并将其从我的 VRXEngine::initVulkan 函数传递给此函数,可以在此处看到:
void VRXEngine::initVulkan(
std::string_view app_name, std::string_view engine_name,
glm::ivec3 app_version, glm::ivec3 engine_version
) {
//... code
std::vector<std::string_view> shaderFilenames{ "vert.spv", "frag.spv" };
VRXDevices::createPipeline(device_, swapChainExtent_, renderPass_, shaderFilenames, pipelineLayout_, graphicsPipeline_);
}
我只使用了着色器文件的名称,例如 vert.spv、frag.spv、geom.spv 等。我不包括此处的路径,因为它们将用作 std::map<string_view, object> 的键.所以我将这些名称的向量从我的::initVulkan 函数传递到::createPipeline()。
在::createPipeline() 内是调用::readFile() 的地方,传入string_view。
现在至于我的问题...在::readFile() 中,我正在创建一个本地string 并尝试使用适当的路径对其进行初始化...然后将string_view 附加到它上面作为着色器的文件名从这两行看...
std::string filename = std::string("Shaders/");
filename.append(shadername);
我正在尝试找出适当的字符串来初始化 filename 与... Shaders/ 将是名称的一部分,但它没有找到文件,我不确定应该使用什么适当的前缀成为...
我在两个项目中的工作目录如下:
- ProjectApp -> $(SolutionDir)x64/Release 和 $(SolutionDir)x64/Debug
- ProjectLib -> $(SolutionDir)x64/Release 和 $(SolutionDir)x64/Debug
所以我需要返回 2 个目录然后进入 VRX Engine/Shader...
返回目录的正确字符串值是多少?
我会用"../../VRX Engine/Shaders/" 初始化filename 还是"././",因为文件夹名称中有空格,我应该在VRX Engine 周围加上引号吗?在将shader name 附加到它之前,我需要用什么来初始化filename?
【问题讨论】:
-
我经历了很多试验和错误......但我最终能够用
../../VRX Engine/Shaders/打开初始化filename的文件。导致它失败的问题与我的LibProject或正在构建为静态库的VRX Engine项目的设置有关。在作为可执行文件构建的Application中,我有上面描述的适当的working path目录。我忘记将LibProject的工作目录更新或修改为相同的...这就是为什么它不起作用并且没有找到或打开文件!
标签: c++ string visual-studio path c++17