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

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

Pipeline(管线/管道)

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

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

举例

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

OpenGL State

什么是OpenGL State,即OpenGL状态机,在OpenGL入门简介稍微提了一下,这里在进一步讲解。
状态机,顾名思义即执行某个事件过程中,有很多可变因素,会影响这个事件的最终结果。更加具象的表达,我们可以类比数学中的多元方程。其中每个变量x都为一种状态,决定这最终y的结果。
a x 1 + b x 2 + c x 3 + . . . . = y ax_{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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值