我的opengl学习进阶之旅着色器编译器和程序二进制码(代码片段)

欧阳鹏 欧阳鹏     2023-02-04     253

关键词:

一、着色器编译器

当你要求OpenGL ES 编译和链接着色器的时候,光花一点时间思考OpenGL ES 必须实现做到的事情。

着色器代码通常解析为某种中间表现形式,这和大部分编程语言相同(例如,抽象语法树)。

编译器必须将抽象表现形式转换为硬件的机器指令。

理想情况下,这个编译器还应该进行大量优化,例如无用代码删除、常量传播等。进行这些工作需要付出代价------主要是CPU时间和内存。

OpenGL ES 3.0 必须支持在线着色器编译(用 glGetBooleanv检索 GL_SHADER_COMPILER值必须是GL_TRUE)。

  • 你可以指定着色器使用glShaderSource,就像我们在前面博客示例中所做的一样。
  • 你还可以尝试缓解着色器编译对资源的影响。也就是说,一旦完成了应用程序中着色器的编译,就可以调用glReleaseShaderCompiler。这个函数提示OpenGL ES实现已经完成了着色器编译器的工作,可以释放它的资源了。注意,这个函数只是一个提示,如果决定用glCompileShader编译更多的着色器,那么OpenGL ES 实现需要重新为编译器分配资源。
void glReleaseShaderCompiler (void);

提示OpenGL ES实现已经完成了着色器编译器的工作,可以释放它的资源了。因为这个函数只是个提示,所以有些实现可能忽略对这个函数的调用。

二、程序二进制码

程序二进制码 是完全编译和链接的程序的二进制表现形式。

它们很有用,因为可以保存文件系统供以后使用,从而避免在线编译的代价。你也可以使用程序二进制码,这样就没有必要在实现中分发着色器源代码。

2.1 glGetProgramBinary

你可以在成功编译和链接程序之后,使用glGetProgramBinary检索程序二进制码。

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


参数说明:

  • program
    程序对象句柄
  • bufSize
    可以写入binary的最大字节数
  • length
    二进制数据的字节数
  • binaryFormat
    供应商专用二进制格式标志
  • binary
    着色器编译器生成的二进制数据指针

2.2 glProgramBinary

当你检索了程序二进制码之后,可以使用glProgramBinary将其保存到文件系统,或者将程序二进制码读回OpenGL ES实现。

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


参数说明:

  • program
    程序对象句柄
  • binaryFormat
    供应商专用二进制格式标志
  • binary
    着色器编译器生成的二进制数据指针
  • length
    二进制数据的字节数

OpenGL ES规范不强制使用任何特定的二进制格式;相反,二进制格式完全取决于供应商。 这明显意味着,程序的可移植性较差。 但是也意味着 供应商可以创建较不笨重的OpenGL ES 3.0实现

实际上,二进制格式在同一供应商的不同驱动程序版本中的实现可能变化。为了确保存储的程序二进制码仍然兼容,在调用glProgramBinary 之后,可以通过glGetProgramiv查询GL_LINK_STATUS。如果二进制码不再兼容,你必须重新编译着色器源代码。

我的opengl学习进阶之旅着色器和程序(上)------着色器(代码片段)

...建和链接程序获取和设置统一变量获取和设置属性着色器编译器和程序二进制代码二、着色器和程序需要创建两个基本对象才能用着色器进行渲染:着色器对象和程序对象。理解 查看详情

我的opengl学习进阶之旅着色器和程序(上)------着色器(代码片段)

...建和链接程序获取和设置统一变量获取和设置属性着色器编译器和程序二进制代码二、着色器和程序需要创建两个基本对象才能用着色器进行渲染:着色器对象和程序对象。理解 查看详情

我的opengl学习进阶之旅如何抽取着色器代码到assets目录下的glsl文件,以及如何通过java或者c++代码来加载着glsl文件?(代码片段)

...f08;上)------着色器【我的OpenGL学习进阶之旅】着色器编译器和程序二进制码【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)【我的OpenGL学习进阶之旅】OpenGLES着色语言(下)【我的OpenGL学习进阶之旅】OpenGLES... 查看详情

我的opengl学习进阶之旅如何抽取着色器代码到assets目录下的glsl文件,以及如何通过java或者c++代码来加载着glsl文件?(代码片段)

...f08;上)------着色器【我的OpenGL学习进阶之旅】着色器编译器和程序二进制码【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)【我的OpenGL学习进阶之旅】OpenGLES着色语言(下)【我的OpenGL学习进阶之旅】OpenGLES... 查看详情

我的opengl学习进阶之旅着色器和程序(下)------程序对象(代码片段)

在博客【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器中我们已经展示了如何创建着色器对象,下一步是创建一个程序对象。如前所述,程序对象是一个容器对象,可以将着色器与之连接,并链... 查看详情

我的opengl学习进阶之旅着色器和程序(下)------程序对象(代码片段)

在博客【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器中我们已经展示了如何创建着色器对象,下一步是创建一个程序对象。如前所述,程序对象是一个容器对象,可以将着色器与之连接,并链... 查看详情

我的opengl学习进阶之旅opengles着色语言(下)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(下)回顾【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)十、函数10.1OpenGLES着色语言限定符10.2函数不能递归十一、内建函数十二、控制流语句12.1if-then-else语句12.2while... 查看详情

我的opengl学习进阶之旅opengles着色语言(下)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(下)回顾【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)十、函数10.1OpenGLES着色语言限定符10.2函数不能递归十一、内建函数十二、控制流语句12.1if-then-else语句12.2while... 查看详情

我的opengl学习进阶之旅opengles着色语言(上)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)前言一、OpenGLES着色语言基础知识二、着色器版本规范三、变量和变量类型3.1标量类型3.2向量类型3.3矩阵类型3.4采样器四、变量构造器4.1如何使用构造器初始化和转换标量... 查看详情

我的opengl学习进阶之旅opengles着色语言(上)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)前言一、OpenGLES着色语言基础知识二、着色器版本规范三、变量和变量类型3.1标量类型3.2向量类型3.3矩阵类型3.4采样器四、变量构造器4.1如何使用构造器初始化和转换标量... 查看详情

我的opengl学习进阶之旅解决着色器编译错误:#versiondirectivemustoccuronthefirstlineoftheshader(代码片段)

一、问题描述今天编写一个OpenGLES的demo,发现没有任何图元输出。查看日志,发现报了如下错误:2021-11-1515:09:07.40626065-26107/opengles3.book.hello_TriangleE/ESShader:ERROR:0:2:'':#versiondirectivemustoccuronthefirstlineoftheshaderERROR:0:9:... 查看详情

我的opengl学习进阶之旅解决着色器编译错误:#versiondirectivemustoccuronthefirstlineoftheshader(代码片段)

一、问题描述今天编写一个OpenGLES的demo,发现没有任何图元输出。查看日志,发现报了如下错误:2021-11-1515:09:07.40626065-26107/opengles3.book.hello_TriangleE/ESShader:ERROR:0:2:'':#versiondirectivemustoccuronthefirstlineoftheshaderERROR:0:9:... 查看详情

我的opengl学习进阶之旅着色器glsl运行时报错glslcompileerror:prematureendofline(代码片段)

一、错误描述今天将项目的着色器代码使用【我的OpenGL学习进阶之旅】C++长行字符串多行书写的方法以及如何书写正确的OpenGLShader着色器代码这篇博客介绍的语法重新改写运行的时候,出错了,如下所示:2022-08-1916:33:25.33416900-16... 查看详情

我的opengl学习进阶之旅着色器glsl运行时报错glslcompileerror:prematureendofline(代码片段)

一、错误描述今天将项目的着色器代码使用【我的OpenGL学习进阶之旅】C++长行字符串多行书写的方法以及如何书写正确的OpenGLShader着色器代码这篇博客介绍的语法重新改写运行的时候,出错了,如下所示:2022-08-1916:33:25.33416900-16... 查看详情

我的opengl学习进阶之旅opengles3.0实现了具有可编程着色功能的图形管线(代码片段)

OpenGLES3.0图形管线的各个阶段1.0固定功能管线和可编程管线1.1顶点着色器1.2图元装配1.3光栅化1.4片段着色器1.5逐片段操作附图说明OpenGLES3.0实现了具有可编程着色功能的图形管线,由两个规范组成:OpenGLES3.0API规范和OpenGLES... 查看详情

我的opengl学习进阶之旅解决着色器语法错误:theshaderusesvaryingu_color,butpreviousshaderdoesnotwritetoit(代码片段)

一、错误描述在加载完顶点着色器和片段着色器,然后link生成program的时候,出现了错误,如下所示:2021-12-3109:34:01.07215937-16006/com.oyp.openglesdemoE/NDK_JNI_LOG_TAG:[GLUtils.cpp][createProgram][181]:GLUtils::creat 查看详情

我的opengl学习进阶之旅opengles3.0实现了具有可编程着色功能的图形管线(代码片段)

...程图如下:对于的中文图如下所示:原文:【我的OpenGL学习进阶之旅】OpenGLES3.0实现了具有可编程着色功能的图形管线https://ouyangpeng.blog.csdn.net/article/details/1212252501.0固定功能管线和可编程管线【我的OpenGL学习进阶之旅... 查看详情

我的opengl学习进阶之旅opengles3.0新功能

...们来概述一下OpenGLES3.0中新增的主要功能。原文:【我的OpenGL学习进阶之旅】OpenGLES3.0新功能https://ouya 查看详情