OpenGL(5)深入理解Pipeline, State, Context

Pipeline(管线/管道)

管线(pipeline),可以理解为渲染流水线。它的最终目的是将输入3D数据经过几个流程的处理,最终被映射到屏幕设备上显示的像素。当然整个流水线生产过程是受OpenGL状态的影响。
线管分为两类:

  1. 固定管线:可以简单理解为渲染图像的这个过程,我们只能通过调用GLShaderManager类的固定管线效果实现我们一系列的着色器处理。
  2. 可编程管线:可以简单理解, 在我们处理图形的过程,我们必须使用顶点着色器和片元着色过程。我们可以才有GLSL自行编写着色器程序,来执行这个过程的事情。

举例

管线可以类比为流水线;比如在生产巧克力时,如果是固定线管,那么我们生产出来的巧克力都是一个形状和一个味道。但如果采用可编程线管,我们可以在巧克力生产时控制其形状以及添加其它味道(比如草莓味,蓝莓味,黑巧克力等)。

OpenGL State

什么是OpenGL State,即OpenGL状态机,在OpenGL入门简介稍微提了一下,这里在进一步讲解。
状态机,顾名思义即执行某个事件过程中,有很多可变因素,会影响这个事件的最终结果。更加具象的表达,我们可以类比数学中的多元方程。其中每个变量x都为一种状态,决定这最终y的结果。
ax1+bx2+cx3+....=yax_{1} + bx_{2} + cx_{3} + .... = y ax1​+bx2​+cx3​+....=y
因此,OpenGL State也是受在其生命周期里所有状态的影响。如下所示,我们为OpenGL的执行过程添加几种状态,这几种状态将会影响最后在屏幕设备上的绘制效果:

glClearColor(1.0,1.0,1.0.1.0);
glEnable(GL_DEPTH_TEST);//开启深度测试
glDisable(GL_DEPTH_TEST);//关闭深度测试glEnable(GL_BLEND);//开启混合
glDisable(GL_BLEND)//关闭混合

所有OpenGL渲染流水线受状态机的影响,典型的如上面例子提到,OpenGL的状态可以影响到巧克力最后生产出来的形状和味道。而在渲染中会直接影响到最终的显示效果。
从上面我们可以总结:

  • OpenGL的状态机有记忆的能力,能够记住自己当前的状态,直到应用程序的状态输入
  • OpenG的状态机接收应用程序的输入,从而修改状态机的状态
  • OpenG的状态机进入某个特殊的状态(停机状态)的时候,它不再接收输入,停止工作

OpenGL Context

OpenGL Context及其切换

对于上下文(Context)这名称在计算机操作系统中,是指一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
同理OpenGL Context保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等。往往应用程序中不止一个窗口在绘制, 因此往往会在每一个绘制线程中都会申请一个绘制上下文(MakeCurrent), 一直作为当前的上下文。所有的绘制相关的操作,都在绘制线程完成。至于OpenGL上下的保存和切换这是由显卡驱动协调处理的。

上下文之间的资源共享

为每个窗口都申请一个绘制上下文(MakeCurrent)的好处是保持上下文的独立,相互不干扰。但窗口间有可能会有共享一份纹理数据的需要,如何避免重复的资源申请呢?
可以先创建上下文A,再以A为输入,创建上下文B,则B可访问在A上下文下创建的纹理资源。
同时这也有限制的:纹理、shader、Buffer等资源是可以共享的,但Frame Buffer Object(FBO)、Vertex Array Object(VAO)等容器对象不可共享,但可将共享的纹理和VBO绑定到各自上下文的容器对象上。

小结

从上面我们可以看出Pipeline, State, Context三者之间的关系,OpenGL是一个大的状态机,控制器管线的输出。而上下文保存了当前正在运行的OpenGL的状态。英
另外从本质上,GL Context和GLState并无多大差别,只是在不同角度看待时它们有不同的着重点。从应用程序的角度看,更多的关注的是GL Context,而从OpenGL内部机制看,则需要考虑GL State。在研究OpenGL spec时,并不考虑多进程多线程的情况,所以,在不引起误解的情况下,OpenGL Pipeline、GL Context和GL State是被混用的。

参考

https://blog.csdn.net/yjguo2004/article/details/4425223
https://blog.csdn.net/hankern/article/details/88792418
https://www.jianshu.com/p/d3dd314c9f83

OpenGL(5)深入理解Pipeline, State, Context相关推荐

  1. 理解Session State模式+FAQ [翻译]

    作者:Patrick Y. Ng 原文地址:http://forums.asp.net/7504/ShowPost.aspx 译者:Tony Qu 译者Blog:tonyqus.cnblogs.com ...

  2. 深入理解Golang之context

    深入理解Golang之context context是Go并发编程中常用到一种编程模式.本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context. 作者:Tur ...

  3. JNI error:libEGL: call to OpenGL ES API with no current context (logged once per

    错误显示: 04-22 13:01:32.935: E/libEGL(17804): call to OpenGL ES API with no current context (logged onc ...

  4. 从Java视角理解CPU上下文切换(Context Switch)

    在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致 ...

  5. OpenGL LookAt函数理解

    前言:记录OpenGL学习过程中的一些知识点,以个人理解为主. LookAt函数将顶点的世界空间坐标转换为观察空间坐标,实际上是以相机为原点重新定义的三维空间. glm::mat4 LookAt(gl ...

  6. opengl 坐标的理解

    [目标]:学习OpenGL中的坐标系统. [参考]: 1.<计算机图形学(OpenGL版) (第三版)> Francis著 (本文主要涉及第三章~第七章) 2.<计算机图形学(Ope ...

  7. Android Camera OpenGL FBO的理解

    背景概念: 首先,Android显示系统中,系统默认的渲染器是OpenGL,混合使用skia,各个厂商可能有不同的实现,大部分都是OpenGL. Android在系统启动时,经过BootLoader启 ...

  8. 理解Go的Context机制

    1. 什么是Context 最近在分析gRPC源码,proto文件生成部分的代码,接口函数的第一个参数统一是ctx context.Context,对这种设计甚是迷惑,于是找些资料,对其背后的原理一探 ...

  9. openGL入门3 --- rasterization pipeline

    Learning Modern 3D Graphics Programming Rasterization Overview 这里简单介绍一下 rasterization 光栅化流程 1)裁剪空间变换 ...

最新文章

  1. 写一个ajax框架,自己写的一个ajax框架,希望大家多提意见
  2. 【暴力】UVALive - 4882 - Parenthesis
  3. PHP调用外部服务获取IP地域信息实现信息的地域性关联
  4. 电子商务概论_大学专业介绍之“电子商务专业”
  5. amazon中文文档
  6. 拓端tecdat|豆瓣大数据分析告诉你,高评分影视密码
  7. Qt QScrollArea and layout in code
  8. mysql 注入攻击与防御_防御SQL注入和XSS攻击
  9. win10计算机文件夹隐藏,详细教您win10如何隐藏文件夹
  10. 企业网站专业性诊断评价
  11. 我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音
  12. 什么是尾递归?javascript 尾递归优化
  13. Java英语单词大全
  14. 企业邮箱登录入口,企业邮箱在哪登录?邮箱ssl安全吗?
  15. JavaScript反调试技巧
  16. LWN: kernel中GCC plugin的未来命运!
  17. Arduino提高篇07—超声波测距
  18. 【node】升级 Node 版本教程
  19. 剑指数据仓库-Hive02
  20. 阿里云服务器安装redis

热门文章

  1. HOPE——懦怯囚禁人的灵魂,希望可以感受自由。强者自救,圣者渡人。
  2. 第10章第16节:使用iSlide创建两个形状平滑切换的动画效果 [PowerPoint精美幻灯片实战教程]
  3. 生活娱乐 最炫名族风恶搞版大全
  4. 虚幻P5:蓝图材质节点
  5. HTML CSS JS简易画板(含知识点温习)
  6. 多多进宝推广团队_什么是多多进宝3大推广方式?什么时候用比较好?
  7. 如何理解Unity组件化开发模式
  8. 管道命令(pipe)
  9. Laravel基础二之Migrations和验证
  10. c语言1 unresolved externals,出现了 unresolved external symbol _main和1 unresolved externals这是什么问题?...