与此问题类似,但适用于 Android:
Android GLES20 支持一个方法 glShaderBinary,它基于这个 gles 文档将加载预编译的着色器二进制文件。但是,我无法找到任何方法来实际预编译任何二进制文件。但是,当我GLES20.glGetIntegerv
使用参数 name调用时GLES20.GL_NUM_SHADER_BINARY_FORMATS
,它确实表明(至少在我正在测试的设备上)存在一种可用的着色器二进制格式。我只是不知道如何实际使用它。
与此问题类似,但适用于 Android:
Android GLES20 支持一个方法 glShaderBinary,它基于这个 gles 文档将加载预编译的着色器二进制文件。但是,我无法找到任何方法来实际预编译任何二进制文件。但是,当我GLES20.glGetIntegerv
使用参数 name调用时GLES20.GL_NUM_SHADER_BINARY_FORMATS
,它确实表明(至少在我正在测试的设备上)存在一种可用的着色器二进制格式。我只是不知道如何实际使用它。
二进制着色器格式是特定于供应商的。对于每个不同的供应商,都有不同的机制将着色器编译为二进制文件。因此,要支持大多数 Android 设备,您需要为特定供应商离线编译着色器,或者在线编译(使用GL_OES_get_program二进制扩展),当然还需要提供 glsl 源作为后备。
以下是一些流行的 GPU 供应商提供的 OpenGL ES 2.0 SDK 列表。它要么包括离线 GLSL 着色器编译器,要么包括有关二进制 GLSL 着色器的文档:
ARM Mali 提供malisc
可执行文件,可以在主机上的命令行中编译着色器。
Qualcomm Adreno 实际上允许在运行时使用 GLSL 着色器的二进制文件glGetProgramBinaryOES
,但不能离线。至少 Adreno SDK 中的文档是这样说的。
PowerVR SDK 还声明其 GPU 允许在运行时使用glGetProgramBinaryOES
.
glGetProgramBinaryOES
函数来自GL_OES_get_program_binary扩展。