You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:24:09