通常情况下,opengl 的shader会被编译成program,然后再将program送到GPU里面去执行。
如果我们的应用程序,每次都用源码编译shader,这样效率肯定是不高的,特别是在嵌入式平台上, 性能比较弱的场景下。
其实我们可以稍微修改一下我们的程序结构,将编译完的program保存下来,下一次再用的时候,直接加载保存好的二进制program就好了,不必每次都编译,浪费时间。
这主要是通过如下两个API来实现的。
glGetProgramBinary
保存program
glProgramBinary
加载program
首先确认是否支持
GLint formats = 0;
glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
if( formats < 1 ) {
std::cerr << "Driver does not support any binary formats." << std::endl;
exit(EXIT_FAILURE);
}
保存二进制program
// Get the binary length
GLint length = 0;
glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &length);
// Retrieve the binary code
std::vector<GLubyte> buffer(length);
GLenum format = 0;
glGetProgramBinary(program, length, NULL, &format, buffer.data());
// Write the binary to a file.
std::string fName("shader.bin");
std::cout << "Writing to " << fName << ", binary format = " <<format << std::endl;
std::ofstream out(fName.c_str(), std::ios::binary);
out.write( reinterpret_cast<char *>(buffer.data()), length );
out.close();
加载二进制program
GLuint program = glCreateProgram();
// Load binary from file
std::ifstream inputStream("shader.bin", std::ios::binary);
std::istreambuf_iterator<char> startIt(inputStream), endIt;
std::vector<char> buffer(startIt, endIt); // Load file
inputStream.close();
// Install shader binary
glProgramBinary(program, format, buffer.data(), buffer.size() );
// Check for success/failure
GLint status;
glGetprogramiv(program, GL_LINK_STATUS, &status);
if( GL_FALSE == status ) {
// Handle failure ...
}