尝试从文件加载片段着色器时出错

Getting error when trying to load fragment shader from file

问题是这样的:将我的着色器代码放在 std::string 中,就像这样

std::string vertex_shader_source = 
        "#version 300 es\n"
        "layout(location = 0) in vec4 verts;\n"
        "void main(){\n"
        "    gl_Position = verts;\n"
        "}\n";

std::string fragment_shader_source =
        "#version 300 es\n"
        "precision mediump float;"
        "out vec3 color;\n"
        "void main() {\n"
        "    color = vec3(1,0,0);\n"
        "}\n";

工作完全正常,程序报告没有错误,但是当我尝试从文件加载完全相同的数据时,片段着色器似乎编译得很好,但程序报告链接和时出错证实。返回的错误字符串要么是空白,要么充满垃圾,所以我也无法从中获得任何有用信息。

我听说有人说这可能与 Windows 使用的行结束字符有关,但在重写 Linux 上的代码后它根本没有改变.

我已经将我试图在 pastebin here 中工作的整个程序包括在内(我使用的着色器文件与 pastebin 中的完全相同,除了引号和换行符) 我现在只能猜测是我在第 93 行的 Renderer::compile_shader_from_file() 方法中读取文件的方式有问题,但是每当我尝试将它加载到一个单独的程序中并检查字符串的内容时,它看起来就好了。

在方法Renderer::compile_shader_from_file中,创建了2个着色器对象(glCreateShader被调用了两次)。最后,"wrong" 对象从方法返回:

unsigned int Renderer::compile_shader_from_file(const std::string& file_path, GLenum shader_type) {
   std::ifstream shader_source_file(file_path);
   unsigned int shader = glCreateShader(shader_type);

   if(shader_source_file.is_open()) {
       // [...]

       unsigned int shader = glCreateShader(shader_type);

       // [...]
   }
   shader_source_file.close();
   return shader;
}

只创建 1 个对象,解决问题:

unsigned int Renderer::compile_shader_from_file(const std::string& file_path, GLenum shader_type) {
    std::ifstream shader_source_file(file_path);
    unsigned int shader = 0;                     // <---

    if(shader_source_file.is_open()) {
        // [...]

        shader = glCreateShader(shader_type);    // <---

        // [...]
    }
    shader_source_file.close();
    return shader;
}