背景

因项目的需要,本人开始学习OpenGL的编程知识,所以以《OpenGL编程指南(原书第九版)》作为学习样板。因之前一直用Qt进行项目的开发,深感Qt编程框架对于项目开发的强大和易用。而书上的样本例程采用的GLFW框架,安装和调试仍然需要花费一定的时间进行学习和熟悉,一旦出现问题后,因GLFW框架的资料过少,一旦出现问题后,势必给学习者带来负担。因此,我尝试用Qt来学习书中的例子程序,并做相应的修改。(文中的每一个程序,都经过了作者的实际编译和运行)。

运行环境如下:

Win10家庭中文版(64位)

显卡GeForce MX250

16G RAM

Qt版本号 5.12.3(Visual Studio 2017 编译器)

第一章

书中的内容我就不赘述了,本文主要着重说明Qt下程序的修改重点,文尾将附上完整的程序。

我们利用Qt建立一个桌面Application框架,新建一个QOpenGLWidget的类来进行OpenGL的操作。MainWindow类创建初始化代码中,加入相应的界面创建代码:

OpenGLWidget* openGLWidget = new OpenGLWidget(this);

QVBoxLayout* centralLayout = new QVBoxLayout();

centralLayout->addWidget(openGLWidget);

this->ui->centralWidget->setLayout(centralLayout);

以上代码非常简单,主要修改的代码位于OpenGLWidget类,首先看下头文件:

/*

Created By APYang 2019/11/5

*/

#include <QWidget>

#include <QOpenGLWidget>

#include <QOpenGLFunctions>

#include <QOpenGLExtraFunctions>

#include <QOpenGLShaderProgram>

#include <QOpenGLFunctions_4_5_Core>

#define BUFFER_OFFSET(offset) ((void *)(offset)

const GLuint NumVertices = 6;

class OpenGLWidget : public QOpenGLWidget,protected QOpenGLFunctions

{

QOpenGLShaderProgram *program;

GLuint programId;

enum VAO_IDs{Triangles, NumVAOs};

enum Buffer_IDs{ArrayBuffer, NumBuffers};

enum Attrib_IDs{vPosition = 0};

GLuint VAOs[NumVAOs];

GLuint Buffers[NumBuffers];

public:

explicit OpenGLWidget(QWidget *parent = 0);

protected:

void initializeGL();

void paintGL();

void resizeGL(int w, int h);

void initVbo();

};

说明:

  1. 在include 区域,我们引入了QOpenGLFunctions_4_5_Core,因为不引入这个头,书上的函数就没法使用,默认是OpenGL1.1的API。
  2. OpenGLWidget类的四个方法,其中initializeGL()放初始化代码、paintGL()完成绘制功能、resizeGL()用于窗口大小变化后的重绘、initVbo()用于初始化顶点。

接下来是OpenGLWidget类实现:

OpenGLWidget::OpenGLWidget(QWidget *parent)

{

}

void OpenGLWidget::initializeGL()

{

initializeOpenGLFunctions();

program = new QOpenGLShaderProgram(this);

if(!program->addShaderFromSourceCode(QOpenGLShader::Vertex, "#version 450 core\n"

"layout (location =0) in vec4 vPosition;\n"

"void main(void)\n"

"{gl_Position =  vPosition;}")){

return;

}

if(!program->addShaderFromSourceCode(QOpenGLShader::Fragment,"#version 450 core\n"

"layout (location = 0) out vec4 fColor;\n"

"void main(void)\n"

"{fColor = vec4(0.5,0.4,0.8,1.0);}")){

return;

}

if(!program->link()){

return;

}

if(!program->bind()){

return;

}

programId = program->programId();

initVbo();

}

void OpenGLWidget::resizeGL(int w, int h)

{

glViewport(0, 0, w, h);

}

void OpenGLWidget::paintGL()

{

QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>();

if (!f){

qWarning()<<"Could not obtain required OpenGL context version";

exit(1);

}

float black[] = {0.0f,0.0f,0.0f,0.0f};

f->glClearBufferfv(GL_COLOR,0,black);

f->glBindVertexArray(VAOs[Triangles]);

f->glDrawArrays(GL_TRIANGLES, 0, NumVertices);

}

void OpenGLWidget::initVbo(){

QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>();

if (!f){

qWarning()<<"Could not obtain required OpenGL context version";

exit(1);

}

GLfloat vertex[NumVertices][2] = {

{-0.9f,-0.9f},

{0.85f, -0.9f},

{-0.9f, 0.85f},

{0.9f,-0.85f},

{0.9f, 0.9f},

{-0.85f, 0.9f},

};

f->glCreateVertexArrays(NumVAOs,VAOs);

f->glCreateBuffers(NumBuffers,Buffers);

f->glNamedBufferStorage(Buffers[ArrayBuffer], sizeof(vertex), vertex,0);

f->glBindVertexArray(VAOs[Triangles]);

f->glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);

f->glVertexAttribPointer(vPosition, 2, GL_FLOAT,GL_FALSE,0, BUFFER_OFFSET(0));

f->glEnableVertexAttribArray(vPosition);

}

其中需要说明的要点:

  1. API的获取需要使用QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>()来进行,当然你也可以用其他不同的版块接口。
  2. 着色器代码的加载和编译,我们直接用Qt的相关类进行了处理,很是方便。(下一章,我们将直接用原生API进行加载、链接和编译)。

运行结果如下:

Qt编程环境下学习《OpenGL编程指南(原书第九版)》(一)相关推荐

  1. Win32 OpenGL 编程(1)Win32下的OpenGL编程必须步骤

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Win3 ...

  2. 南工程c语言实验报告,Linux环境下-C语言编程实验报告(1)(总4页).doc

    Linux环境下-C语言编程实验报告(1)(总4页).doc 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称 Linux环境下 C语言编程 专业名称 网络工程班 级 1203班 学生姓名 ...

  3. linux环境c语言课程设计,linux环境下c语言编程课程设计

    linux环境下c语言编程课程设计 (14页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 1/14LINUX操作系统教程课程设计题目算术 ...

  4. 基于jupyter编程环境下——Python入门:列表4

    列表 四.操作列表 1.使用列表的一部分 -- 切片 2.元组 Python资料:Python编程XG:从入门到实践. 四.操作列表 1.使用列表的一部分 -- 切片 在前面学习了如何访问单个列表元素 ...

  5. Linux环境下的网络编程

    本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代  码实例.要理解本文所谈的技术问题需要读者 ...

  6. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  7. Win32环境下动态链接库(DLL)编程原理

    Win32环境下动态链接库(DLL)编程原理 比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系 ...

  8. 图像的读取 matlab,Matlab编程环境下图像的读取

    <Matlab编程环境下图像的读取>由会员分享,可在线阅读,更多相关<Matlab编程环境下图像的读取(7页珍藏版)>请在人人文库网上搜索. 1.实验一 Matlab编程环境下 ...

  9. 基于Python实现的微信小程序校园导航系统 | Python第一课环境篇 | Hellow World 程序 | 不同环境下搭建Python编程环境

    一:Hellow World 程序 1.安装Python3 2.运行Python代码片段 Python自带了一个在终端窗口中运行的解释器,让你无需保存并运行整个程序就能尝试运行Python代码片段. ...

  10. TIA 博途编程环境下专有技术保护的实现-密码保护与取消

    TIA 博途编程环境下专有技术保护的实现-密码保护与取消 概述 TIA Portal为程序块提供 KNOW_HOW_PROTECT 保护功能.如果没有使用正确密码打开使用此保护功能的块时,仅块接口参数 ...

最新文章

  1. C#精髓【月儿原创】第一讲 使用垃圾回收器
  2. Markdown简单语法
  3. ios 消除 字符串 首尾空格
  4. hive in 写法/linux OR CDH如果查看hive的版本
  5. 哪种网络访问控制方法最适合?
  6. Spring请求级备忘录
  7. Django模型关系
  8. xe DateTimePicker.Date bug
  9. GitHub 标星 11000+,阿里开源的微服务组件如何连续 10 年扛住双十一大促?
  10. Java static静态关键字 有啥用
  11. 射线包含于凸集的充要条件
  12. 电力系统中无线测温装置的设计与应用
  13. tweenMax代码未定义问题
  14. excel自动计算体育成绩
  15. AppleTV相关使用教程
  16. 互联网 B C端产品对比分析
  17. react项目中实现打印预览功能
  18. 苹果套路直播计算机隐藏版,套路计算器app,套路计算器隐藏官网版app预约 v1.0 - 浏览器家园...
  19. 电赛2019年F题纸张测量FDC2214的初始化代码(含STM32f103zet6和f103c8t6)胎教式
  20. 台式机计算机怎么分割,电脑切割分区:如何将一个分区划分成两个或多个

热门文章

  1. 删除任务管理器中的启动项
  2. 数据库系统概论第五版第二章答案王珊
  3. i5 7200u 计算机专业,i5 7200U理论性能对比_笔记本评测-中关村在线
  4. SAM2695 带效果器的低功耗单芯片合成器
  5. [渝粤教育] 西北农林科技大学 食品安全概论 参考 资料
  6. MATLAB数学建模方法与实践(第3版)程序及数据
  7. 抖音矩阵号系统搭建及开发思路分享丨抖音短视频关键词优化
  8. 视频教程-Dubbo视频教程-Java
  9. (渝粤教育)网络教育远程教育统考计算机应用基础复习题
  10. 通过Python将不同的附件发给不同的收件人