什么是一帧图像,从不同的维度讲会有不一样的答案。

opengl 是一个跨平台api,它可以跑在windows上,linux上,android上,iOS上,也可以跑在浏览器上。opengl本身没有适配不同平台的能力,它需要一个与平台之间的适配层才能实现绘制。这个适配层在windows上叫wgl, 在linux上叫glx, 在android上叫egl。

Android UI系统传给egl一个Surface对象,egl管这个Surface对象叫NativeWindow。egl拿着这个NativeWindow去做一些初始化操作之后,就会创建一个Context。这个Context包含一个双缓冲区,分别为前缓冲区和后缓冲区(front buffer, back buffer)。

opengl的所有操作都是在后缓冲区back buffer上绘制的。当程序员认为一帧的绘制已经完成之后,他就会调用一个eglSwapBuffers函数。该函数会交换前后缓冲区,此时opengl绘制的所有内容就出现在surface上。

从这个维度上讲,我们认为eglSwapBuffers这个函数调度就一帧图像的标志。

RenderPass

RenderPass从字面上理解就是一次渲染管线的执行。这么说可能还不太好理解。Opengl 本身是没有Render pass的概念的,但新一些的API如Vulkan是有render pass的概念的。

我们先从头理一下。
egl为opengl的执行创建了一个上下文Context。这时Context中绑定了一个默认的Framebuffer。后续所有的渲染都是在这个framebuffer上进行的。

当我们调用drawcall来绘制一组三维物体的时候,实际上这个drawcall并没有立即执行,或者说并不保证立即执行了,gl库的实现也可能只是制作了一个命令队列,往这个命令队列里填加了一些命令,当你调用下一条opengl函数时,上一个函数会没有被执行,它还在排队。也就是说普通的opengl函数是异步的。

所有的opengl函数都是异步的肯定是不行的,有些时候我们必须保证某个函数返回时,它及它之前的函数都真正被执行了。也就是说要有一些不普通的函数,它们是同步的。比如说glFinish,当这个函数返回时,gl库会保证之前的命令全部都执行完毕了。

还有glFlush,gl库会立即把队列里的所有命令提交给显卡去执行一轮。
在glFlush和glFinsh之后的函数调用,都会落在下一轮渲染管线执行中了。

还有一些其他的函数也隐含了render pass的切换:

  1. 当调用eglSwapBuffers的时候,egl的前后缓冲交换了,此时framebuffer相当于与变了,所以上一个渲染管线肯定要执行完,之后的gl函数都做用于下一轮渲染。
  2. 当调用glBindFramebuffer来切换GL_FRAMEBUFFER或GL_DRAW_FRAMEBUFFER时,之前的命令也一定会在上一个framebuffer上执行完毕,之后的命令做用于切换后的framebuffer。
  3. glFramebufferTexture*() 或 glFramebufferRenderbuffer() ,这两个命令没有切换framebuffer,而是切换了framebuffer的attachment。opengl命令绘制实际最终是落在attachment上的,所以这两个函数也标志了render pass的切换。
  4. glFenceSync和glClientWaitSync之前的命令,也属于一个renderpass。

draw call

opengl绘图的方式就好比摄影师在摄影。

切换一帧图向相当于洗一张照片。
切换一次render pass相当于拍一张底片。
一张照片可以对应一个或多个底片,因为摄影师可以拿多个底片去PS成一张人工底片,然后再洗一张实体照片。
而一次draw call则相当于做一次布景动作。
在摄像师拍照的时候,他会:

  1. 找一个舞台
  2. 在舞台上放一个凳子
  3. 在凳子上放一个人
  4. 在人的怀里放一个小白兔玩偶
    以上是四个draw call。

draw call的标志很简单,一个glDrawXXX函数调用就是一个drawcall的结束标志。

函数

每个draw call是由多个函数组成的。

3D物体

一个drawcall往场景里放一个3D物体。在虚拟世界里,3D物体不是由原子组成的,而是由网格mesh和皮肤(skin, 通常是texture)组成的。

mesh包括顶点和顶点之间的连接关系。

送顶点的opengl函数glBufferData或glBufferSubData。
它一次送一组顶点,一个顶点不光包括这个顶点的3维坐标值,还可能包含其他的顶点属性,具体包含拿些属性是灵活可变的。常见的一组属性有:

  1. 3维坐标
  2. 顶点颜色
  3. 顶点法线
  4. 纹理坐标

这些属性可以通过一个glBufferData/glBufferSubData一次性送到一个Buffer中,也可以通过多个glBufferData/glBufferSubData送到多个Buffer。
所以一个draw call可以只涉及一个顶点Buffer,也可以涉及多个顶点Buffer。

把属性放在多个顶点Buffer的好处是,你可以拿一个3维坐标去搭配不同的顶点颜色,从而画不同颜色的物体。

OpenGL之显卡(二十六)相关推荐

  1. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  2. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  3. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  4. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  5. 2008R2Win7管理二十六ADRMS客户端使用及侦错

    2008R2Win7管理二十六ADRMS客户端使用及侦错 预计我以后都没太多时间专研新技术和写文啦,尽量挤时间吧,有一篇放一篇吧,呵呵 本篇介绍在win7客户端使用adrms来进行权限管理和侦错,在使 ...

  6. SAP UI5 初学者教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  7. 微信小程序把玩(二十六)navigator组件

    微信小程序把玩(二十六)navigator组件 原文:微信小程序把玩(二十六)navigator组件 navigator跳转分为两个状态一种是关闭当前页面一种是不关闭当前页面.用redirect属性指 ...

  8. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  9. FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList

    贪婪加载顾名思议就是把所有要加载的东西一次性读取. 本节内容为了配合[延时加载]而诞生,贪婪加载和他本该在一起介绍,开发项目的过程中应该双管齐下,才能写出高质量的程序. Dto 映射查询 Select ...

最新文章

  1. c++ make_pairpair
  2. 自动驾驶领域:一种实时高精度的城市道路场景语义分割方法
  3. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
  4. anguarjs 上传图片预览_设计神器!图片批量压缩、格式转换、调整尺寸的在线工具...
  5. 单页面应用SPA的优缺点
  6. mongodb远程连接配置(亲测)
  7. 【springboot】【若依(ruoyi)】@RestController 接口支持 JSONP
  8. 技术干货|基于Apache Hudi 的CDC数据入湖
  9. 一种User Mode下访问物理内存及Kernel Space的简单实现
  10. JS 新建web sql 数据表
  11. 用SSH登录远程的机器,在远程机器上执行本地机器上的脚本
  12. react-TodoList案例
  13. Linux安装包下载地址(国内)
  14. 前亚马逊中国总裁王汉华出任好耶CEO
  15. MyBatis 之 SqlMapConfig.xml 配置
  16. 服务器内存系统,服务器内存系统容量
  17. mac idea svn配置
  18. STM32单片机(二).STM32系列单片机的介绍
  19. android密码输入框6,Android 6位支付密码 密码输入框 极简单的代码实现 看这篇就够了...
  20. 命令查看(获取)本机IP地址

热门文章

  1. OpenFileDialog获取文件名和文件路径问题
  2. Java并发编程笔记
  3. 陶老师ESD、EMI、EMC讲座
  4. VS2019下安装NumCpp库小结
  5. 如何用递归处理一个数组中的数据成为一个树结构_Spark处理的一些业务场景(持续更新ing)...
  6. vuex mutations_Vuex 的基本知识总结
  7. C语言涉及数组的大作业,c语言大作业_基于数组的学生信息管理系统.doc
  8. 木纹标识lisp_lisp 习题 用列表元素标识文件一行。
  9. 客户端软件 大华_大华“飞燕”,一款主打稳定WiFi的路由器!
  10. centos7忘记root密码重置