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

2023-12-15 12:50:41

背景

为了提高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);
}

文章来源:https://blog.csdn.net/GengWenhui123/article/details/134872013
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。