OpenGL ES 3.0 | 着色器编译器
时间:2022-07-23
本文章向大家介绍OpenGL ES 3.0 | 着色器编译器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
- 当你要求OpenGL ES
编译
和链接着色器
时, 思考 OpenGL ES 实现 必须要做的事情; -
着色器代码
通常解析为某种中间表现形式
, 这和大部分编译语言
相同(例如,抽象语法树
); -
编译器
必须将抽象表现形式
转化为硬件的机器指令
。 理想状态下, 这个编译器
还应该进行大量的优化
, 例如无用代码删除、常量传播
等; 进行这些工作需要付出代价——主要是CPU时间
和内存
; -
OpenGL ES 3.0 实现
必须支持
在线着色器编译
(用glGetBooleanv
检索GL_SHADER_COMPILER
值必须是GL_TRUE
); - 可以指定着色器使用
glShaderSource
; -
可以尝试缓解
着色器编译
对资源的影响; 一旦完成了应用程序中着色器的编译, 就可以调用void glReleaseShaderCompiler(void)
; 这个函数提示 OpenGL ES,我们已经完成了着色器编译器
的工作, 可以释放它的资源了; 不过注意, 这个函数只是一个提示, 如果决定用glCompileShader
编译更多
的着色器
, 那么OpenGL ES需要重新为编译器分配资源
。
程序二进制码
程序二进制码
是完全 编译和链接的 程序
的二进制表现形式
。- 可以保存到
文件系统
供以后使用,避免在线编译
的代价; - 如果使用
程序二进制码
,就不用在实现中分发着色器源代码
; - 可以在成功地
编译和链接程序 之后
, 使用glGetProgramBinary
检索程序二进制代码
:
- 检索了
程序二进制代码
之后, 可以用glProgramBinary
将其保存到文件系统
, 或者将程序二进制代码
读回OpenGL ES
实现:
程序二进制码的兼容问题处理
-
OpenGL ES 规范
不强制使用任何特定的二进制格式
; 相反,二进制格式
完全取决于供应商
; 即程序的可移植性
比较差
, 但是意味着供应商
可以创建较不笨重
的OpenGL ES 3.0实现
; -
实际上,
二进制格式
在同一供应商
的不同驱动程序版本中
的实现
可能出现变化
; 为了确保
是存储的程序二进制代码
仍然兼容
, 在调用glProgramBinary
之后, 可以通过glGetProgramiv
查询GL_LINK_STATUS
, 如果二进制码
不再兼容
, 则须重新编译
着色器源代码。
参考自:
- 《OPENGL ES 3.0编程指南(第2版)》
- SpringMVC注解@RequestMapping之produces属性导致的406错误
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- SpringBoot整合Mybatis之进门篇
- Tomcat和Java Virtual Machine的性能调优总结
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
- 简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
- Java设计模式之适配器设计模式(项目升级案例)
- Java设计模式之模板方法设计模式(银行计息案例)
- 多线程之策略模式
- 文件上传的动作不能太俗,必须页面无刷新上传
- 这次真的忽略了一些ActiveMQ内心的娇艳
- 多线程编程:阻塞、并发队列的使用总结
- 多线程编程:多线程并发制单的开发记录【一】
- 如何使用线程锁来提高多线程并发效率
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)
- [记录点滴] OpenResty中Redis操作总结
- [源码解析] 从TimeoutException看Flink的心跳机制
- [记录点滴] 一个解决Lua 随机数生成问题的办法
- [记录点滴] 记录一次用 IntelliJ IDEA遇到scope provided 的坑
- [记录点滴] 一个Python中实现flatten的方法
- [源码解析]Oozie来龙去脉之提交任务
- [记录点滴]Ionic编译过程的研究
- [记录点滴]OpenResty 支持http v2的问题
- [源码解析]Oozie来龙去脉之内部执行
- [记录点滴]编译安装luarocks、luacheck、luautf8
- [笔记整理] 一维搜索
- [记录点滴] 使用工具和命令对redis数据进行备份恢复
- [记录点滴]Spring Boot Admin源码分析笔记
- [记录点滴] luaxml编译过程