现代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++命令行程序的基础上学习的。
- OpenGL Step by Step - OpenGL Development.mhtml
- 现代 OpenGL 教程_OpenGL 教程 极客学院wiki
- 现代OpenGL+Qt学习笔记之一:概述
- 现代OpenGL+Qt学习笔记之五:OpenGL矩阵变换
- 现代OpenGL+Qt学习笔记之二:程序框架
- 现代OpenGL+Qt学习笔记之八:GLSL双面渲染
- 现代OpenGL+Qt学习笔记之十二:模拟聚光灯
- Qt OpenGL:学习现代3D图形编程之一,画一个三角形
- OPENGL学习笔记之一
- 现代OpenGL+Qt学习笔记之三:显示一个彩色三角形
- 现代OpenGL+Qt学习笔记之四:使用Uniform变量实现对模型的旋转
- 现代OpenGL+Qt学习笔记之六:绘制可旋转、带光照效果的三维物体
- 现代OpenGL+Qt学习笔记之七:Phong光照及在GLSL中使用函数
- 现代OpenGL+Qt学习笔记之九:smooth和flat着色模式
- 现代OpenGL+Qt学习笔记之十:使用逐片元渲染提升真实感
- 现代OpenGL+Qt学习笔记之十一:使用halfway向量提高光照计算效率
- OpenGL ES学习笔记之一
- openGL学习笔记之一--视图
- C#现代OpenGL笔记
- OpenGL学习笔记1:OpenGL概述
- FTP,SFTP,FTPS区别
- 一帧之内删除所有子级
- (1) racecar零件购买
- 秒杀系统的架构之道
- NGUI优化ScroolView中Grid子级太多导致的滑动问题
- 现代OpenGL+Qt学习笔记之一:概述
- UVA10534[Wavio Sequence] 动态规划 LIS
- 网易笔试题20170909
- 【拜小白opencv】29-平滑处理2线性滤波之——均值滤波
- Express + Session 实现登录验证
- Ubuntu 16.04搭建LAMP开发环境
- 爬虫自学笔记(Python3.6.1)
- Comparator<String>接口,String类数组按字符串长度排序
- linux命令--rpm命令