当前位置: 首页 > article >正文

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

http://www.kler.cn/news/163453.html

相关文章:

  • 【C语言】——函数递归,用递归简化并实现复杂问题
  • 预训练--微调
  • WordPress使用Swiper实现图片灯箱功能
  • uniapp引入插件市场echarts图表(l-echart)实现小程序端图表,并修改源码简化使用
  • 文本编辑软件:Ulysses mac介绍说明
  • 老胡的周刊(第119期)
  • Java程序设计实验6 | 集合类
  • springboot(ssm寝室小卖部系统 宿舍小商店网站Java(codeLW)
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • vscode创建python虚拟环境
  • kennard-stone算法实现样本集划分(ks算法)
  • 思维链(CoT)提出者 Jason Wei:关于大语言模型的六个直觉
  • C#-快速剖析文件和流,并使用
  • 【Linux ping命令检查服务器是否可用】
  • mysql支持的整数类型、各类型整数能够表示的数值范围
  • python:mplfinance 画K线图+布林线
  • 【C++】map/multimap/set/multiset的经典oj例题 [ 盘点&全面解析 ] (28)
  • git如何配置多个远程仓库,并且进行切换
  • Qt 容器QGroupBox带有标题的组框框架
  • 二叉树的层序遍历[中等]
  • C++基础 -42- STL库之list链表
  • Qt 鼠标左键推拽界面
  • bash中通过变量中的内容获取对应的关联数组
  • Navicat 技术指引 | 适用于 GaussDB 分布式的日志查询与配置设置
  • JWT介绍及演示
  • 自动抓取App数据
  • 笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)
  • 搜索引擎和网络浏览器之间的区别
  • 【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系
  • 【漏洞复现】FLIR AX8红外线热成像仪命令执行漏洞