Adreno OpenGL ES 3.1 介绍(3)

  • 4.1.7单独的着色器对象
  • 4.1.8着色器存储缓冲区对象

4.1.7单独的着色器对象

OpenGL ES中的关键对象类型之一是程序对象。 他们需要进行任何类型的draw call。 随着应用程序变得越来越复杂,现代OpenGL ES应用程序创建数百个程序对象的情况并不少见。

使用大量程序对象会带来一些成本:

  • 加载时间更长,因为每个程序对象都需要链接(或从外部存储)可用于绘图操作
  • 内存使用量增加

单独的着色器对象解决了这些问题。 现在,不需要昂贵的过程来构造程序对象并链接多个着色器对象。 而是可以将每个着色器对象制成一个着色器程序。 然后可以将着色器程序(每个着色器阶段一个)插入到称为管道对象的新对象中。 一旦将管道对象绑定到渲染上下文,只要没有其他程序对象被激活,就可以将其用于所有绘制调用。

在将着色器程序用于管道对象之前,需要先对其进行链接。 此过程类似于链接程序对象,但仅限于该特定的着色器阶段。 链接着色器程序后,也可以保存二进制表示形式,以在下次启动应用程序时重新使用它。

现在,使用着色器程序,应用程序可以即时构建管道对象。 由于以下原因,这比使用程序对象的旧方法要有效得多:

  • 管道对象不需要链接; 将着色器程序插入管道对象,然后开始发出绘图调用。
  • 应用程序通常使用许多程序对象,这些程序对象共有相同的顶点着色器,并由片段着色器进行区分。 使用单独的着色器对象,仅需要构建一次用于顶点着色器的着色器程序。 然后,可以根据需要在管道对象中重复使用相同的着色器程序多次。 这样可以节省链接器原本必须重复分析同一顶点着色器的时间。

着色器程序保存统一的状态信息。 如果使用单独的着色器对象方法,请分别为每个着色器程序配置统一值。 使用程序对象时不是这种情况。 统一状态以持久方式存储,因此不必担心在切换到其他管道对象时信息会丢失。 但是,如果在多个管线对象之间重用相同的顶点着色器程序,请记住更新所有需要针对不同管线配置采用不同值的统一。

4.1.8着色器存储缓冲区对象

在上一章中讨论了统一缓冲区。 这些是OpenGL ES 3.0中引入的更重要的功能之一。 但是,它们仍然有两个不幸的约束:

  • 在最坏的情况下,最大大小可以低至16 KB。 如果将数量乘以单个着色器阶段(12个)中可用的最坏情况下的最大统一块数,则总数为192KB。 通常这是足够的,但是它确实要求可以拆分数据,这并不总是可行的。
  • 统一缓冲区是只读的。

OpenGL ES 3.1中引入的SSBO解决了这两个问题。 保证它们支持最大227个字节(134,217,728字节)的数据块,并且它们可用于读取和写入操作。 实际的最大数据块大小取决于OpenGL ES的实现,并且可能超过上述值。 可以通过将pname参数设置为GL_MAX_SHADER_STORAGE_BLOCK_SIZE的glGetInteger64v进行检查。

在计算着色器阶段,所有OpenGL ES 3.1实现都必须支持SSBO。 其他着色器阶段的支持是可选的。

等同于统一块的SSBO被称为着色器存储块,具有以下主要区别:

  • 在OpenGL ES着色语言代码中,统一关键字被buffer替换。
  • 着色器存储块的最后一个成员可以是未调整大小的数组。 数组的大小是在运行时计算的,其方式是充分利用支持着色器存储块的数据存储的实际大小。
  • 在基于Adreno的平台上,访问统一块比着色器存储块要快得多。

着色器调用可以随时修改着色器存储块的内容。 注意内存访问的同步。 第4.1.4节讨论了一系列内存限定符关键字。 这些关键字可以为OpenGL ES实施提供有关变量将如何使用的宝贵提示。 可以在着色器存储块变量的声明中使用相同的关键字。 一个绝对必要的用例是,要对单个绘制调用执行的不同着色器阶段之间重复使用数据。 在某些情况下,需要使用内存屏障来确保不发生线程争用。 这些障碍可以在OpenGL ES着色器语言代码中或在OpenGL ES API级别上运行。 可以在此处找到更多详细信息:

  • OpenGL ES 3.1规范– http://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
  • glMemoryBarrier的OpenGL ES 3.1参考页– http://www.khronos.org/opengles/sdk/docs/man31/html/glMemoryBarrier.xhtml和memoryBarrier – http://www.khronos.org/opengles/sdk/docs/man31/html/memoryBarrier.xhtml
  • OpenGL ES 3.1着色器语言规范(请参见第4.9节,内存访问限定符)– http://www.khronos.org/registry/gles/spec/3.1/GLSL_ES_Specification_3.10.pdf

在某些情况下,有可能避免使用上述同步技术的需要。 或者,使用原子函数。 原子函数是在OpenGL ES 3.1着色语言中引入的一组函数,这些函数将许多不同的原子操作应用于带符号或无符号整数类型的缓冲区或共享变量。

提供以下功能:

  • atomicAdd –将两个值加在一起
  • atomicAnd –对两个值执行按位AND运算
  • atomicCompSwap–如果变量内容的现有值与调用方在另一个参数中提供的值不同,则为该变量分配一个值
  • atomicExchange –将变量设置为新值并返回原始值
  • atomicMax –返回两个值中的最大值
  • atomicMin –返回两个值中的最小值
  • atomicOr –对两个值执行按位“或”运算
  • atomicXor –对两个值执行按位异或运算

以下是着色器存储缓冲区对象的一些示例用例:

  • 是计算着色器与外界交换数据的主要方式
  • 着色器可以使用它来访问大型数据集,这些数据集太大而无法适合纹理,例如顶点拉动技术

Adreno OpenGL ES 3.1 介绍(3)相关推荐

  1. Adreno OpenGL ES 2.0 介绍(3)

    Adreno OpenGL ES 2.0 介绍(3) 1. 应用程序示例 1.2 在Android上创建ES 2.0 上下文/环境 1.3 Adreno GPU检测 1.4 检查支持的ES拓展 1. ...

  2. opengl、opengl es、webgl介绍与opengl开发入门

    1.OpenGL OpenGL(英语:Open Graphics Library,译名:开放图形库或者"开放式图形库")常用于CAD.虚拟现实.科学可视化程序和电子游戏开发.Ope ...

  3. OpenGL ES基本概念介绍

    最近不太忙,打算这周开始学习下OpenGL,网上也已经有好多关于OpenGL的书籍和资料了.至于为什么还要写,是为了养成一个良好的学习习惯,也算给自己的学习过程做一个总结. 基本概念 OpenGL定义 ...

  4. 【Android OpenGL开发】OpenGL ES与EGL介绍

    什么是OpenGL ES OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的编程图形程序接口,主要用于图像的渲染. Android提供了简化版的OpenGL接口,即O ...

  5. viewpager初始化fragment没有绘制_NDK OpenGL ES渲染系列 之 绘制三角形

    前言 新的知识学习都是循序渐进的,从基础到复杂.前面OpenGL ES概念 已经介绍了OpenGL ES的相关概念,这篇文章开始我们就正式开始OpenGL ES渲染系列第一站---绘制三角形.绘制三角 ...

  6. 从显示一张图片开始学习OpenGL ES

    前言 网上很多介绍OpenGL ES的文章,但由于OpenGL ES内容太多,所以这些文章难免过于臃肿杂乱,很难抓住重点,对于初学者来说最后还是云里雾里.很多人(包括笔者本人)开始深入了解OpenGL ...

  7. 一文学会 PC搭建opengl es C++开发环境

    Windows搭建opengl es C++开发环境 之前编写Native的OpenGL ES实现代码时,使用的编译工具无论是Android Studio还是eclipse都给我一种:用txt文档中写 ...

  8. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  9. 【OpenGL ES】入门及绘制一个三角形

    本文首发于个人博客:Lam's Blog - [OpenGL ES]入门及绘制一个三角形,文章由MarkDown语法编写,可能不同平台渲染效果不一,如果有存在排版错误图片无法显示等问题,烦请移至个人博 ...

最新文章

  1. Simple Dynamic Strings(SDS)源码解析和使用说明二
  2. uni-app 音频控制
  3. DNN数据库核心表结构及设计思路探研
  4. stdio.h: C++输入输出操作
  5. 倒计时3天|阿里云数据库创新上云峰会亮点剧透
  6. Django中的视图(view)
  7. c++编码规范_汽车嵌入式软件测试——嵌入式软件标准及规范简介
  8. 谁说漂亮女程序猿就不能拿大厂Offer了?
  9. 【MATLAB】基本绘图函数(涵盖所有基本绘图指令)
  10. Postman 发包工具详解
  11. Xmind 8思维导图使用方法
  12. 星星之火-56:前传接口 CPRI容器的字长、能力与CPRI速率的对应关系
  13. 戴尔3080计算机重装系统步骤,终于发现戴尔笔记本重装系统的方法
  14. 最简单小米设备怎么不root激活xposed框架
  15. ORAN C平面 Section Extension 5
  16. HttpRunner
  17. 企业为什么要做等保?不做等保有什么后果?
  18. 【PMP】PMP考试易错点总结和答题技巧总结
  19. PCI相关(2)- PCI桥与配置
  20. j - 分组(动态规划)

热门文章

  1. element ui 表格 前端 上下行互换位置
  2. 点击切换下一页上一页
  3. Kindeditor使用常见问题
  4. 区块链入门--准备搭建自己的区块链
  5. HDU 4808 Drunk(数学)
  6. Docker-查看镜像仓库中镜像的版本信息
  7. 看周鸿祎麻辣点评中国互联网公司
  8. 基于MyEclipse+JSP+Mysql+Servlet+Tomcat开发得简单的网络考试系统
  9. 如何测量PWM波的占空比
  10. C++对C语言的扩充