IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> QT配置GLFW GLEW 进行OpenGL开发 -> 正文阅读

[C++知识库]QT配置GLFW GLEW 进行OpenGL开发

最近在QT平台上进行OpenGL的开发学习,再按照网上教程学习的过程中,常常出现网上代码中的函数无法使用的情况,因为使用的是QT自带的OpenGL库,而网上的教程大多是在VS平台上基于GLFW+GLEW或是GLFW+GLAD。当然,因为是初学,不确定是否有其他替换函数来实现的方法。
为了减少麻烦,索性尝试在QT平台配置GLFW+GLEW来学习OpenGL。以下是配置的流程,做一下记录,以防忘记。

一.创建QT工程


在这里插入图片描述
在这里插入图片描述
这里记得选择64位
在这里插入图片描述

二.下载GLFW


https://www.glfw.org/download.html上根据自己电脑的版本号下载对应的GLFW压缩包。这里我选择下载64位的压缩包
在这里插入图片描述
下载下来后需要下图中标出的两个文件夹

在这里插入图片描述
我在工程目录中创建了名为 OpenGLEnvironment的文件夹 并在里面分别创建了glfw文件夹 glew文件夹 用来存放需要的配置文件
在这里插入图片描述
在这里插入图片描述

将刚刚下载的GLFW文件夹中的 include 文件夹 以及 lib-mingw-w64 文件夹放入OpenGLEnvironment文件夹的glfw文件夹内 如下图所示
在这里插入图片描述

三.下载GLEW


从网站 http://glew.sourceforge.net/中下载所需的GLEW压缩包
在这里插入图片描述
将下载下来的GLEW文件夹内的内容,全部放入OpenGLEnvironment文件夹的glew文件夹中 如下图所示

在这里插入图片描述

四.QT配置


将刚刚include 文件夹内 以及 lib文件夹内的内容 加入进库中
在这里插入图片描述
在这里插入图片描述

glfw文件夹内 选择libglfw3dll.a 选择 动态链接
记得将 “为debug版本添加‘d’作为后缀”选项的勾去掉
包含路径选择 include文件夹所在路径
在这里插入图片描述

glew 也是外部库 选择glew32s.lib 不过这次选择静态库
包含路径选择 include文件夹所在路径
同样将 “为debug版本添加‘d’作为后缀”选项的勾去掉
在这里插入图片描述

最后对 工程的 pro 文件做修改
添加 LIBS += -lopengl32 -luser32
DEFINES += GLEW_STATIC

删除
在这里插入图片描述

最后应该如下图所示
在这里插入图片描述

五.添加工程文件

创建新的类 我这里取为QPaintingWidget
在这里插入图片描述
h文件修改为

#ifndef QPAINTINGWIDGET_H
#define QPAINTINGWIDGET_H

#include <QWidget>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <QOpenGLWidget>
class QPaintingWidget : public QOpenGLWidget
{
    Q_OBJECT
public:
    explicit QPaintingWidget(QWidget *parent = nullptr);
    ~QPaintingWidget();

signals:

protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;

private:
    unsigned int shaderProgram ;
    unsigned int VBO, VAO;

};

#endif // QPAINTINGWIDGET_H


注意将#include <GL/glew.h> 放在#include <GLFW/glfw3.h>前面

cpp 文件修改为

#include "qpaintingwidget.h"
#include <iostream>
using namespace std;
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

const char *vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\0";
const char *fragmentShaderSource = "#version 330 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n\0";

QPaintingWidget::QPaintingWidget(QWidget *parent) : QOpenGLWidget(parent)
{

}

QPaintingWidget::~QPaintingWidget()
{
     glDeleteVertexArrays(1, &VAO);
     glDeleteBuffers(1, &VBO);
     glDeleteProgram(shaderProgram);

}
void QPaintingWidget::initializeGL() {
    glfwInit();
    glewInit();
    // build and compile our shader program
        // ------------------------------------
        // vertex shader
        unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
        glCompileShader(vertexShader);
        // check for shader compile errors
        int success;
        char infoLog[512];
        glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
        if (!success)
        {
            glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
        }
        // fragment shader
        unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
        glCompileShader(fragmentShader);
        // check for shader compile errors
        glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
        if (!success)
        {
            glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
        }
        // link shaders
        shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragmentShader);
        glLinkProgram(shaderProgram);
        // check for linking errors
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
        if (!success) {
            glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
        }
        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);

        // set up vertex data (and buffer(s)) and configure vertex attributes
        // ------------------------------------------------------------------
        float vertices[] = {
            -0.5f, -0.5f, 0.0f, // left
             0.5f, -0.5f, 0.0f, // right
             0.0f,  0.5f, 0.0f  // top
        };


        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VBO);
        // bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
        glBindVertexArray(VAO);

        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);

        // note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        // You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other
        // VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.
        glBindVertexArray(0);
}

void QPaintingWidget::paintGL() {
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // draw our first triangle
    glUseProgram(shaderProgram);
    glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organized
    glDrawArrays(GL_TRIANGLES, 0, 3);


}
void QPaintingWidget::resizeGL(int w, int h) {

}

widget.h 修改为

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "qpaintingwidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QPaintingWidget *m_painting;
};
#endif // WIDGET_H

widget.cpp修改为

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    resize(800,800);
    m_painting=new QPaintingWidget(this);
    m_painting->resize(800,800);



}

Widget::~Widget()
{
    delete ui;
}


最后贴一张结果图
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:08:08  更:2022-04-01 23:10:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:38:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码