前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenGL ES 3.0 | 着色器编译器

OpenGL ES 3.0 | 着色器编译器

作者头像
凌川江雪
发布2020-08-13 15:37:33
9180
发布2020-08-13 15:37:33
举报
文章被收录于专栏:李蔚蓬的专栏李蔚蓬的专栏

概述

  • 当你要求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版)》
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 程序二进制码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档