OpenGL(5)深入理解Pipeline, State, Context
OpenGL(5)深入理解Pipeline, State, Context
Pipeline(管线/管道)
管线(pipeline),可以理解为渲染流水线。它的最终目的是将输入3D数据经过几个流程的处理,最终被映射到屏幕设备上显示的像素。当然整个流水线生产过程是受OpenGL状态的影响。
线管分为两类:
- 固定管线:可以简单理解为渲染图像的这个过程,我们只能通过调用GLShaderManager类的固定管线效果实现我们一系列的着色器处理。
- 可编程管线:可以简单理解, 在我们处理图形的过程,我们必须使用顶点着色器和片元着色过程。我们可以才有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相关推荐
- 理解Session State模式+FAQ [翻译]
作者:Patrick Y. Ng 原文地址:http://forums.asp.net/7504/ShowPost.aspx 译者:Tony Qu 译者Blog:tonyqus.cnblogs.com ...
- 深入理解Golang之context
深入理解Golang之context context是Go并发编程中常用到一种编程模式.本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context. 作者:Tur ...
- 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 ...
- 从Java视角理解CPU上下文切换(Context Switch)
在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致 ...
- OpenGL LookAt函数理解
前言:记录OpenGL学习过程中的一些知识点,以个人理解为主. LookAt函数将顶点的世界空间坐标转换为观察空间坐标,实际上是以相机为原点重新定义的三维空间. glm::mat4 LookAt(gl ...
- opengl 坐标的理解
[目标]:学习OpenGL中的坐标系统. [参考]: 1.<计算机图形学(OpenGL版) (第三版)> Francis著 (本文主要涉及第三章~第七章) 2.<计算机图形学(Ope ...
- Android Camera OpenGL FBO的理解
背景概念: 首先,Android显示系统中,系统默认的渲染器是OpenGL,混合使用skia,各个厂商可能有不同的实现,大部分都是OpenGL. Android在系统启动时,经过BootLoader启 ...
- 理解Go的Context机制
1. 什么是Context 最近在分析gRPC源码,proto文件生成部分的代码,接口函数的第一个参数统一是ctx context.Context,对这种设计甚是迷惑,于是找些资料,对其背后的原理一探 ...
- openGL入门3 --- rasterization pipeline
Learning Modern 3D Graphics Programming Rasterization Overview 这里简单介绍一下 rasterization 光栅化流程 1)裁剪空间变换 ...
最新文章
- 写一个ajax框架,自己写的一个ajax框架,希望大家多提意见
- 【暴力】UVALive - 4882 - Parenthesis
- PHP调用外部服务获取IP地域信息实现信息的地域性关联
- 电子商务概论_大学专业介绍之“电子商务专业”
- amazon中文文档
- 拓端tecdat|豆瓣大数据分析告诉你,高评分影视密码
- Qt QScrollArea and layout in code
- mysql 注入攻击与防御_防御SQL注入和XSS攻击
- win10计算机文件夹隐藏,详细教您win10如何隐藏文件夹
- 企业网站专业性诊断评价
- 我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音
- 什么是尾递归?javascript 尾递归优化
- Java英语单词大全
- 企业邮箱登录入口,企业邮箱在哪登录?邮箱ssl安全吗?
- JavaScript反调试技巧
- LWN: kernel中GCC plugin的未来命运!
- Arduino提高篇07—超声波测距
- 【node】升级 Node 版本教程
- 剑指数据仓库-Hive02
- 阿里云服务器安装redis
热门文章
- HOPE——懦怯囚禁人的灵魂,希望可以感受自由。强者自救,圣者渡人。
- 第10章第16节:使用iSlide创建两个形状平滑切换的动画效果 [PowerPoint精美幻灯片实战教程]
- 生活娱乐 最炫名族风恶搞版大全
- 虚幻P5:蓝图材质节点
- HTML CSS JS简易画板(含知识点温习)
- 多多进宝推广团队_什么是多多进宝3大推广方式?什么时候用比较好?
- 如何理解Unity组件化开发模式
- 管道命令(pipe)
- Laravel基础二之Migrations和验证
- c语言1 unresolved externals,出现了 unresolved external symbol _main和1 unresolved externals这是什么问题?...