OpenGL ES 3.0编程指南:第四章. Shaders and Programs --- (三)Shader Compiler and Program Binaries

1. Shader Compiler

OpenGL ES 3.0的各种实现必须支持shader编译,也就是说,用glGetBooleanv调用GL_SHADER_COMPILER必须是GL_TRUE。(相对的,在OpenGL里,shader编译是可选的,有些实现支持,有些不支持,不支持shader编译的那些实现会通过其他方法提供预编译好的shader)
编译器编译shader时,会占用一些资源,比如内存。如果我们完成了所有shader的编译,之后不需要再编译,那么可以选择将其释放,如果将其释放之后,又进行了shader编译,那么还是会重新分配资源:

void glReleaseShaderCompiler (void)

  • 这个方法只是一个hint,所以有些实现会忽略这条命令

2. Program Binaries

Program Binaries 是一个完全编译和链接的program对象的二进制表现形式,使用 Program Binaries 可以避免编译开销,并且不用呈现shader的源代码。

检索Program Binaries :

void glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei * length, GLenum binaryFormat, GLvoid * binary)

  • program : program对象
  • bufSize : 可能被写入到binary的字节最大值
  • length :写入binary的字节数
  • binaryFormat : binary格式
  • binary : bianry数据

检索完成之后,可以将其保存到文件系统,或者调用下面方法读回到 OpenGL ES:

void glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid * binary, GLsizei length)

  • program : program对象
  • binaryFormat : binary格式
  • binary : bianry数据
  • length :写入binary的字节数

OpenGL ES并不指定任何二进制格式,二进制格式完全由各个实现的供应商决定,这意味着使用glProgramBinary的程序的可移植性不强,即使同一供应商的不同版本之间,二进制格式也可能改变。所以,为了确保程序兼容,在调用glProgramBinary之后,需要通过glGetProgramiv调用GL_LINK_STATUS来检查状态,如果失败,那么还需要重新编译shader源码。

你可能感兴趣的:(OpenGL ES 3.0编程指南:第四章. Shaders and Programs --- (三)Shader Compiler and Program Binaries)