原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78762511
《OpenGL学习笔记》系列博客目录地址:http://blog.csdn.net/qq21497936/article/category/7315532
OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL
前话
经常看到技术需求当中有opengl,所以有时间就介绍并学习下opengl,opengl对于Qt来说只是窗口不一样,其调用的实际函数都是opengl的原生函数,所以这可以说学会opengl是完全意义上的一通百通,OpengGL经过了版本更新在编码方式上发生了很大的变化,从最开始的管线到后续的VAO和VBO,在这个过程中Qt的版本升级也对不同版本的opengl进行了一些封装。渲染管线
在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线完成的。图像渲染管线可以被划分为两个主要部分:第一个部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。
渲染管线接收一组3D坐标,然后把它们转变为你屏幕上的有色2D像素。渲染管线可以被划分为几个阶段,每个阶段需要把前一阶段的输出作为输入。所有这些阶段都是高度专门化的,它们能简单地并行执行。由于它们的并行执行的特征,当今大多数显卡都有成千上万的小处理核心GPU,在GPU上为每一个阶段运行各自的小程序,从而在图形输送管道中快速处理你的数据。这些小程序叫做着色器。有些着色器允许开发者自己配置,用我们自己写的着色器替换默认存在的。这样我们就可以更细致地控制渲染管线的特定部分,因为它们运行在GPU上,所以它们也会节约宝贵的CPU时间。着色器是用OpenGL着色器语言(OpenGL Shading Language)GLSL写成的。
VAO和VBO
OpenGL抛弃glEnable(),glColor(),glVertex(),glEnable()这一套流程的函数和管线以后,就需要一种新的方法来传递数据到Graphics Card来渲染几何体,我们可以用VBO, 在3+版本我们可以使用VAO和VBO。
VAO(VertexArray Object-VAO)是一个对象,其中包含一个或者更多的VBO。
VBO(VertexBuffer Objects)是GraphicsCard中的一个内存缓冲区,用来保存顶点信息,颜色信息,法线信息,纹理坐标信息和索引信息等等。
GLWidget与QOpenGLWidget
GLWidget与QOpenGLWidget类都是OpenGL图形渲染控件。重写其paintGL(),resizeGL(),initializeGL()三个函数。
initializeGL() 设置OpenGL渲染上下文,定义了显示列表,等会调用一次,第一次调用resizeGL()或paintGL()之前调用,一般是加载顶点数据,着色器数据和一些初始化的工作。
resizeGL() 设置OpenGL视口,投影,等被当部件已调整大小(也可以当它是第一次因为所有新创建的控件会自动调整大小事件),一般是调整GL视图的大小,窗口大小变化后需要重置OpenGL的视图窗口大小。
paintGL() 渲染OpenGL场景。每当需要更新小部件时调用,即OpenGL画图都在此类当中,调用updateGL(QGLWdiget使用)和updateBehavior(QOpenGLWidget使用)来触该函数重绘OpenGL视口。
此两类主要是使用gl和glu函数编程。
QGraphicsScene
QGraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的items,
QGraphicsScene提供了方便的函数来让你高效的找到items的位置,或者决定在scene上哪个item可以看到,配合QGraphicsView窗口,你可以让可见scene,或者缩放场景来可见一部分。
此类可托管给opengl,通过opengl来显示,实际编程与gl无太多关系。
学习方向转变
经过对以上几个相关方面的了解和从各位前辈大神请教,除了qt的场景类与opengl编程无紧密的关系外,其他三种方式都是与opengl紧密相关。
通过对管线,vao,vbo的了解,根据大神们的建议,转向非QtOpengl的学习,下一章节开始,将会更换学习的指导教程,侧重OpengGl本身的学习,按照新的教程,一步一步学习和总结OpengGl。
不同语言的opengl使用,只是在窗口显示,键盘鼠标捕捉等编程语言平台的区别,核心的画图,显示,动作都是opengl本身可实现的,与编程平台无关(版本有关)。
系列博客更名
下一章节,本系列博客将会更名为《OpenGL学习笔记(四):XXXXXXXXXXXXXXX》,学习OpenGL本身。
原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78762511