美文网首页
小白学opengl 第一课

小白学opengl 第一课

作者: 技术喵 | 来源:发表于2019-07-09 07:35 被阅读0次

第一课:创建一个OpenGL窗口

选择空项目

0_1526345895281_QQ截图20180515084615.png

输入项目名称和位置

0_1526345931933_QQ截图20180515084648.png

选择编译器

0_1526345958327_QQ截图20180515084656.png

创建成功后,首先添加pri文件,pri文件可以管理我们的类文件,类似一个小项目的感觉

0_1526345984469_QQ截图20180515084928.png

输入pri名字

0_1526346029022_QQ截图20180515084949.png

此时项目结构,只有pro项目文件,和pri文件

0_1526346106557_QQ截图20180515085040.png

修改pro代码,改变项目结构

0_1526346152132_QQ截图20180515085115.png

右键pri文件,在pri下创建窗口类

0_1526346188098_QQ截图20180515085147.png

输入窗口名

0_1526346216835_QQ截图20180515085222.png

创建完毕的项目结构

0_1526346239009_QQ截图20180515085248.png

为项目添加main.cpp

0_1526346285326_QQ截图20180515085426.png

输入main.cpp

0_1526346314449_QQ截图20180515085436.png

openglwindow.h代码

#ifndef OPENGLWINDOW_H
#define OPENGLWINDOW_H

#include <QtGui/QWindow>
#include <QtGui/QOpenGLFunctions>

QT_BEGIN_NAMESPACE
class QPainter;
class QOpenGLContext;
class QOpenGLPaintDevice;
QT_END_NAMESPACE

class Openglwindow : public QWindow, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    explicit Openglwindow(QWindow *parent=0);
    ~Openglwindow();

    //基于QPainter渲染
    virtual void render(QPainter *parent);
    //基于opengl渲染
    virtual void render();
    //初始化
    virtual void initialize();
    //设置动画
    void setAnimating(bool animating);

public slots:
    //手动刷新一次
    void renderLater();
    //立刻渲染
    void renderNow();

protected:
    //监听事件
    bool event(QEvent *event) override;
    //监听暴露事件
    void exposeEvent(QExposeEvent *event) override;

private:
    //动画状态位
    bool m_animating;

    //OpenGL 上下文
    QOpenGLContext *m_context;
    //OpenGL画笔设备,能使用QPainter在上下文里画东西
    QOpenGLPaintDevice *m_device;
};

#endif // OPENGLWINDOW_H

openglwindow.cpp代码

#include "openglwindow.h"
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLPaintDevice>
#include <QtGui/QPainter>

Openglwindow::Openglwindow(QWindow *parent)
    :QWindow(parent)
    ,m_animating(false)
    ,m_context(0)
    ,m_device(0)
{
    //设置使用OpenGL上下文渲染OpenGL
    setSurfaceType(QWindow::OpenGLSurface);
}
Openglwindow::~Openglwindow()
{
    //删除设备
    delete m_device;
}
void Openglwindow::render(QPainter *painter)
{
    Q_UNUSED(painter);
}

void Openglwindow::initialize()
{
}
void Openglwindow::render()
{
    //第一次没有画笔设备,需要创建画笔设备
    if (!m_device)
        m_device = new QOpenGLPaintDevice;

    //清除屏幕, 颜色缓冲区和深度缓冲区和模板缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    //设置大小
    m_device->setSize(size());

    //创建画笔
    QPainter painter(m_device);
    //用QPainter渲染一次
    render(&painter);
}
void Openglwindow::renderLater()
{
    //请求刷新,窗口会收到UpdateRequest事件
    requestUpdate();
}
bool Openglwindow::event(QEvent *event)
{
    switch (event->type()) {
    case QEvent::UpdateRequest:
        renderNow();
        return true;
    default:
        return QWindow::event(event);
    }
}
void Openglwindow::exposeEvent(QExposeEvent *event)
{
    Q_UNUSED(event);

    //如果窗口暴露,显示,立刻渲染画面
    if (isExposed())
        renderNow();
}
void Openglwindow::renderNow()
{
    if (!isExposed())
        return;

    bool needsInitialize = false;

    //没有上下文就创建上下文
    if (!m_context) {
        m_context = new QOpenGLContext(this);
        //设置格式
        m_context->setFormat(requestedFormat());
        //创建
        m_context->create();

        needsInitialize = true;
    }

    //激活上下文
    m_context->makeCurrent(this);

    if (needsInitialize) {
        //初始化当前上下文的OpenGL函数解析
        initializeOpenGLFunctions();
        initialize();
    }

    render();

    //交换前后缓冲区,完成一帧渲染
    m_context->swapBuffers(this);

    if (m_animating)
        renderLater();
}
void Openglwindow::setAnimating(bool animating)
{
    m_animating = animating;

    if (animating)
        renderLater();
}

main.cpp代码

#include <QtGui/QGuiApplication>
#include "openglwindow.h"

int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);

    QSurfaceFormat format;
    //设置采样率
    format.setSamples(16);

    Openglwindow window;
    window.setTitle(QStringLiteral("第一个OpenGLFunctions例子"));
    window.setFormat(format);
    window.resize(640, 480);
    window.show();

    return app.exec();
}

运行

0_1526349599163_QQ截图20180515095818.png

源代码下载

https://gitee.com/chen227/opengl_OpenGLFunctions

相关文章

  • 小白学opengl 第一课

    第一课:创建一个OpenGL窗口 选择空项目 输入项目名称和位置 选择编译器 创建成功后,首先添加pri文件,pr...

  • 小白学opengl 课程目录

    前言 qt对opengl进行了封装,使用很方便,便于我们的学习qt下的opengl有很多解决方案 QGLWidge...

  • OpenGL ES:新手村中的HelloWorld

    前言 对于OpenGL ES,本人现在还是一个小白,所以我将用小白视角对OpenGL ES进行小白式的讲解.希望能...

  • 小白学opengl 第零课

    Qt OpenGL的准备工作 下载安装vs 2015 下载安装qt 最新版(http://download.qt....

  • 聊一聊GPU

    最近BOSS安排了一个任务,学习OpenGL,既然是学OpenGL,那总得知道OpenGL是做什么的,而在这之前,...

  • 小白学opengl 第二课

    第二课:你的第一个多边形 新建窗口类TriangleWindow,继承Openglwindow trianglew...

  • 小白学opengl 第三课

    第三课:上色 修改上节课的颜色值 运行

  • 小白学opengl 第五课

    第五课:向三维进军 3个点组成一个三角形面,如果要画个三菱锥,需要4个面前面,左侧面,右侧面,底面 点1显示红色,...

  • 小白学opengl 第四课

    第四课:旋转 坐标轴遵循右手坐标系 x轴旋转 y轴旋转 z轴旋转

  • 会计学小白成长之路——顺序集

    会计学小白成长之路1 会计学小白成长之路2 会计学小白成长之路3 会计学小白成长之路4 会计学小白成长之路5 会计...

网友评论

      本文标题:小白学opengl 第一课

      本文链接:https://www.haomeiwen.com/subject/bosihctx.html