OpenGL 着色器程序的保存和加载(二进制)

背景

为了提高OpenGL 着色器程序的编译和链接速度,我们可以将程序保存为二进制进行加载,可以大幅度提升加载效率。

方法

以下是加载和保存二进制程序的方法。

// 加载着色器程序的二进制文件到已创建的着色器程序中
bool loadPragram(const std::string& programFilePath, unsigned int programId)
{
   
    // Load binary from file
    std::ifstream inputStream(programFilePath, std::ios::binary);
    if (!inputStream.is_open())
    {
   
        inputStream.close();
        WARN_LOG(" gl program binary file not exist! programfile:%s", programFilePath.c_str());
        return false;
    }
    unsigned int format = 0;
    inputStream.read(reinterpret_cast<char*>(&format), sizeof(GLenum));
    inputStream.seekg(sizeof(GLenum));
    std::istreambuf_iterator<char> startIt(inputStream), endIt;
    std::vector<char> buffer(startIt, endIt);  // Load file
    inputStream.close();
    // Install shader binary
    glProgramBinary(programId, format, buffer.data(), buffer.size());
    int success;
    glGetProgramiv(programId, GL_LINK_STATUS, &success);
 if (!success)
    {
   
        WARN_LOG("Install gl program failed.program file:%s,program id:%d ,format:%d", programFilePath.c_str(), programId, format);
        return false;
    }
       
    INFO_LOG("load gl program success.program name:%s", programFilePath.c_str());
    return true;
}
// 保存着色器的二进制信息到文件中
void saveProgram(const std::string& programFilePath,unsigned int programId)
{
   
    GLint length = 0;
    glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &length);

    // Retrieve the binary code
    std::vector<GLubyte> buffer(length + sizeof(GLenum));
    GLenum format = 0;
    glGetProgramBinary(programId, length, NULL, &format, buffer.data());

    // Write the binary to a file.
    std::ofstream out(programFilePath, std::ios::binary);
  out.write(reinterpret_cast<char*>(buffer.data()), length);
    out.close();
    INFO_LOG("save gl program success.program name:%s,binary format:%d", programFilePath.c_str(), format);
}

相关推荐

  1. OpenGL 着色程序保存二进制

    2023-12-11 07:52:03       42 阅读
  2. OpenGLOpenGL ES显示YUV图片着色差别(一)

    2023-12-11 07:52:03       27 阅读
  3. OpenGL着色内存访问

    2023-12-11 07:52:03       31 阅读
  4. 19 OpenGL计算着色

    2023-12-11 07:52:03       26 阅读
  5. Pytorch学习 day12(模型保存

    2023-12-11 07:52:03       22 阅读
  6. SVM 保存模型参数

    2023-12-11 07:52:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 07:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 07:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 07:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 07:52:03       20 阅读

热门阅读

  1. QList 方法

    2023-12-11 07:52:03       32 阅读
  2. 雪花算法:分布式系统的关键艺术

    2023-12-11 07:52:03       40 阅读
  3. 《C++20设计模式》---原型模式学习笔记代码

    2023-12-11 07:52:03       34 阅读
  4. Linux 定时任务备份MySQL数据库

    2023-12-11 07:52:03       40 阅读
  5. Mybatis-plus中wrapper的区别

    2023-12-11 07:52:03       35 阅读
  6. react表单-受控

    2023-12-11 07:52:03       41 阅读
  7. c++模板学习笔记

    2023-12-11 07:52:03       33 阅读
  8. 跨境电商运营常用的ChatGPT通用提示词模板

    2023-12-11 07:52:03       38 阅读