C++游戏引擎读取SPV着色器触发std::runtime_error运行时错误排查
问题根因
1. 直接错误点:路径字符串有多余空格
你在EditorWindowConfig.h中定义顶点着色器路径时,末尾多了一个无效空格:
G_piplne::EdtrPipeLine edtrPipeLine{"../../Shaders/simpleShader.vert.spv ", "../../Shaders/simpleShader.frag.spv"}; // 注意上面vert路径末尾多了一个空格
操作系统识别文件路径时会把空格算作文件名的一部分,会尝试查找名称末尾带空格的.spv文件,自然匹配不到你实际存放的文件,触发readFile函数抛出的std::runtime_error。
2. 辅助排查点:未捕获异常导致看不到具体错误
你在readFile里已经把找不到的路径拼接到了异常信息里,但整个调用链路没有加try catch捕获异常,异常直接抛出后触发程序崩溃,你看不到错误信息里提示的具体是哪个文件、用什么路径尝试访问的,增加了排查难度。
3. 潜在问题:相对路径基准不匹配
你用的../../Shaders/相对路径,是相对于程序运行时的工作目录,不是相对于头文件的存放目录。Visual Studio等IDE默认的运行时工作目录是.vcxproj项目文件所在的目录,和exe生成目录、头文件目录都可能不一致,也会导致路径查找失败。
排查修复步骤
- 先删掉顶点着色器路径末尾的多余空格,确认两个路径字符串里没有其他不可见字符。
- 在初始化
EdtrPipeLine的位置增加异常捕获,打印具体错误信息:// 可以把edtrPipeLine的初始化放到run函数里,或者在类构造函数里加try catch try { G_piplne::EdtrPipeLine edtrPipeLine{"../../Shaders/simpleShader.vert.spv", "../../Shaders/simpleShader.frag.spv"}; } catch (const std::runtime_error& e) { std::cout << "错误信息:" << e.what() << std::endl; // 这里打断点就能直接看到系统尝试访问的路径是否符合预期 } - 如果还是报错,先把路径换成绝对路径测试,确认文件读取逻辑正常后,再根据你的项目目录结构调整相对路径,或者在IDE的运行配置里修改工作目录为你预期的基准路径。
- 也可以在
readFile函数开头加一行打印,输出传入的filepath参数值,直接确认路径是否符合预期。
内容的提问来源于stack exchange,提问作者Prinzeono Key
相关产品推荐
相关产品推荐

