现代OpenGL+Qt学习笔记之一:概述

来源:互联网 发布:收银软件交流群 编辑:程序博客网 时间:2024/05/16 11:32

现代OpenGL+Qt学习笔记之一:概述

  学习了一点Qt,现在写程序都想用Qt了,GUI程序容易开发而且美观,又因为经常要用到OpenGL,所以就想学习一下在Qt中如何使用OpenGL了。传统的固定管线,之前一直在VS中写代码的时候用,用的很熟练,也很舒服。但是现代OpenGL都出现这么久了,想着用用高级一点的东西也挺好,来吧,开始学习!

现代OpenGL

  OpenGL根据其渲染管线的不同,可以分为传统OpenGL和现代OpenGL两类。
  传统OpenGL使用的渲染管线叫固定函数管线,懒得贴图,反正就是按顺序来,先干嘛后干嘛的。其绘制通常发生在函数glBegin()和glEnd()之间。开启和关闭状态(如光照)用glEnable()和glDisable()函数。和现代OpenGL相比,大家都说这个不灵活,反正看应用,有些时候可能需要使用的OpenGL API比较少,比如只用来显示一些三维物体,使用简单的OpenGL定义好的光照模型的时候,其实传统OpenGL更加容易上手,也谈不上灵活不灵活的问题。
  现代OpenGL使用的渲染管线叫做可编程渲染管线,这里的可编程主要是针对可编程管线中的着色器而言的。着色器可以理解为现代OpenGL渲染管线中的几段小程序,每一段的小程序可以替代传统OpenGL管线的一个或者多个函数的功能,甚至可以更加灵活,因为可编程嘛!这些着色器程序是用GLSL(OpenGL Shading Language)语言编写的,和C++很像的一种语言,入口函数都是main()。所以学习现代OpenGL意味着还要学习一门新的编程语言,不过难度不是太大,学习现代OpenGL中慢慢学习即可。

Qt中的OpenGL

  我目前用的是Qt5.8版,不知道从哪个版本开始,Qt就基本放弃了Qt中的旧的opengl模块。现在在Qt中使用OpenGL主要是使用Qt GUI模块中的封装的几个OpenGL函数。要实现一个可以显示OpenGL内容的组件,通常需要实现一个同时继承自QOpenGLFunctions和QOpenGLWidget的类。
  继承QOpenGLFunctions就能够使用现代OpenGL的API,但不继承这个类其实也行,可以通过别的途径访问现代OpenGL API,这里就不介绍了。
  而继承QOpenGLWidget就可以实现在部件中绘图了,最重要的,QOpenGLWidget有3个函数paintGL()、resizeGL()、和initializeGL(),通过重写这个3个函数,就可以实现OpenGL的初始化和绘制功能了。initializeGL()的调用发生在另外两个函数之前,且只会被调用一次,在这个函数中可以对OpenGL进行初始化,如设置背景色(清除颜色缓冲区)、设置全局光照、变异和链接着色器、创建着色程序等;resizeGL()的调用发生在窗口第一次出现和每一次窗口改变大小时,可以在这里设置视口和投影矩阵等;paintGL()是绘制函数,用来绘制内容,它在每一次发生重绘事件时被调用。
  Qt中封装的主要几大和现代OpenGL相关的类是
- QOpenGLBuffer
- QOpenGLFramebufferObject
- QOpenGLShaderProgram
- QOpenGLTexture
- QOpenGLDebugLogger
- QOpenGLTimerQuery
- QOpenGLVertexArrayObject
其中常用的类有QOpenGLBuffer、QOpenGLShaderProgram和QOpenGLTexture,其中前两个很快就会接触到。

小结

  这里就介绍这么多,需要更多信息的就需要自己看一些电子书或者网上资源了。我这里主要是要学习在Qt中如何使用OpenGL,当然了,尽量避开繁琐的现代OpenGL的API,而使用Qt中封装的几个和OpenGL相关的类(还是很繁琐,需要一段时间的适应)。
  短期内的笔记计划如下:
- 在Qt中使用现代OpenGL,主要创建一个在Qt程序中使用现代OpenGL的程序框架
- 具体的现代OpenGL学习,这是本笔记的主要内容了,会慢慢介绍现代OpenGL的使用方法,程序框架建立好后,主要介绍的就是GLSL了,这也是现代OpenGL的核心。

推荐阅读

  如果不想在Qt框架下学习现代OpenGL,推荐一个资源,中英文对照的现代OpenGL教程,英文是原作,后来有大牛翻译了,我没有具体学习,应该是在C++命令行程序的基础上学习的。

  1. OpenGL Step by Step - OpenGL Development.mhtml
  2. 现代 OpenGL 教程_OpenGL 教程 极客学院wiki
阅读全文
0 0