Qt之QOpenGLWidget

本想基于FFmpeg+QOpenGLWidget实现一个视频播放器,阅读相关资料后,发现OpenGL主要用于绘制画面,或者渲染3D模型,使用FFmpeg+SDL做视频播放器更加通用一些,遂放弃,简单梳理QOpenGLWidget的相关使用

OpenGL

OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。
当今,OpenGL是视频行业领域中用于处理2D/3D图形的最为广泛接纳的API,在此基础上,为了用于计算机视觉技术的研究,从而催生了各种计算机平台上的应用功能以及设备上的许多应用程序。其是独立于视窗操作系统以及操作系统平台,可以进行多种不同邻域的开发和内容创作,简而言之,其帮助研发人员能够实现PC、工作站、超级计算机以及各种工控机等硬件设备上实现高性能、对于视觉要求极高的高视觉图形处理软件的开发。

OpenGL是一种client-server(client-server)类型的系统。我们编写的程序就是一个client。而我们的计算机图形硬件制造商提供的OpenGL的实现就是server。在一些OpenGL的实现里(比如一些和X Window System相关的应用),client和server可能会在不同的机器上运行。中间用网络连接。在这样的情况下,client能够发起OpenGL命令,然后转换成窗体系统特定的协议,再发送给server,终于在server上运行OpenGL进行图像显示。

注意,顶点数组保存在你的应用程序(系统内存),它在客户端。且处在服务端的OpenGL访问它们。这就是为什么拥有顶点数组这些特殊命令的原因,使用glEnableClientState()与glDisableClientState()而不是glEnable()与glDisable()。

Shader(着色器)

着色器(Shader)是用来实现图像渲染的,用来替代固定渲染管线的可编辑程序。其中Vertex Shader主要负责顶点的几何关系等的运算,Pixel Shader(Fragment Shader)主要负责片源颜色等的计算。
着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编辑性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制。

着色器本质上是一种运行在显卡 CPU 上的程序,用于控制显卡的图形渲染过程。CPU 运行的程序通常用汇编语言,或者 C++、Java 等高级语言编写。GPU 采用的是不同于 CPU 的并行计算结构,需要一种适用于 GPU 的编程语言,于是就有了着色器语言。

OpenGL Context

OpenGL是一个仅仅关注图形渲染的图像接口库,它所完成的工作也仅仅是计算机图形学的渲染部分。而OpenGL的渲染上下文是OpenGL在其中存储渲染信息的一个数据结构,它会将各种状态信息保存在上下文中,包括顶点信息、纹理信息、编译好的着色器信息等等,之后的绘制工作就要基于这些信息来完成,当一个上下文被销毁的时候,它所对应的OpenGL渲染工作也将结束。

QOpenGLWidget

QOpenGLWidget提供了将OpenGL显示的图形集成到Qt 应用程序的功能。可以通过继承QOpenGLWidget,并简单的重写paintGL/resizeGL/initialGL这三个虚函数来实现OpenGL的常用功能:

  • paintGL():渲染OpenGL场景。每当窗口界面需要更新时调用。
  • resizeGL():设置OpenGL视口、投影等。每当小部件调整大小时(以及第一次显示时,因为所有新创建的小部件都会自动获得调整大小事件),都会调用它。
  • initializeGL():设置OpenGL资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次。

版权声明:本文为qt_dog原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。