当试图从文件[关闭]中加载碎片着色器时,出现错误。


问题是这样的。把我的shader代码放在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上重写代码后,它完全没有改变。

我已经把我想让它工作的整个程序包含在一个名为 粘贴栏(我使用的shader文件和pastebin中的完全一样,除了引号和换行)我现在能猜到的是,我在第93行的Renderer::compile_shader_from_file()方法中读取文件的方式出了问题,但每当我试着在一个单独的程序中加载它并检查字符串的contens时,它看起来就很好。

解决方案:

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

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;
}

只需要创建一个对象,就可以解决这个问题。

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;
}

给TA打赏
共{{data.count}}人
人已打赏
未分类

用Python做频谱分析仪?[关闭]

2022-9-8 21:38:41

未分类

Python帮助。如何获取输入文件的值并在脚本中传递它们的值。

2022-9-8 21:49:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索