当前位置: 首页 > news >正文

Qt之OpenGL使用Qt封装好的着色器和编译器

代码

#include "sunopengl.h"

sunOpengl::sunOpengl(QWidget *parent) {}



unsigned int VBO,VAO;
float vertices[]={
    0.5f,0.5f,0.0f,
    0.5f,-0.5f,0.0f,
    -0.5f,-0.5f,0.0f,
    -0.5f,0.5f,0.0f
};

unsigned int indices[]={
    0,1,3,
    1,2,3,
};
unsigned int EBO;
sunOpengl::~sunOpengl()
{
    makeCurrent();
    glDeleteVertexArrays(1,&VAO);
    glDeleteBuffers(1,&VBO);
    glDeleteBuffers(1,&EBO);
    //glDeleteProgram(shaderProgram);
    doneCurrent();
}
void sunOpengl::initializeGL()
{
    this->initializeOpenGLFunctions();
    glGenVertexArrays(1,&VAO);
    glGenBuffers(1,&VBO);

    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),(GLvoid*)0);
    //开始VOA属性
    glEnableVertexAttribArray(0);

    //EBO
    glGenBuffers(1,&EBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);

    shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shades/shapes.vert");
    shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shades/shapes.frag");
    bool success=shaderProgram.link();
    if(!success)
    {
        qDebug()<<shaderProgram.log();
    }

    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
}

void sunOpengl::resizeGL(int w, int h)
{

}

void sunOpengl::paintGL()
{
     shaderProgram.bind();
     //glUseProgram(shaderProgram);
    glClearColor(0.2f,0.3f,0.3f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    if(!isDraw)
        return;
    glBindVertexArray(VAO);
   // glDrawArrays(GL_TRIANGLES,0,6);
    glDrawElements(ShapeType,6,GL_UNSIGNED_INT,0);
    glBindVertexArray(0);

}

void sunOpengl::drawrectangle()
{
    ShapeType=GL_TRIANGLES;
    isDraw=true;
    update();
}

void sunOpengl::setPloygonMode(bool isWire)
{
    makeCurrent();
    if(isWire)
    {
        glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    }
    else
    {
        glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    }
    doneCurrent();
    update();
}

void sunOpengl::clear()
{
    isDraw=false;
    update();
}
//定点着色器-》几何着色-》图元装配-》光栅化-》片段着色器-》测试与混合
#ifndef SUNOPENGL_H
#define SUNOPENGL_H

#include <QOpenGLWidget>
#include<QOpenGLFunctions_3_3_Core>//unction_>
#include<QOpenGLShaderProgram>
class sunOpengl : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
public:
    explicit sunOpengl(QWidget* parent = nullptr);
    ~sunOpengl();
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    void drawrectangle();
    void clear();
    void setPloygonMode(bool isWire);
    bool isDraw;
    int ShapeType;
    QOpenGLShaderProgram shaderProgram;
};

#endif // SUNOPENGL_H

 

相关文章:

  • 【图像分类】【深度学习】图像分类评价指标
  • (区间 dp)洛谷 P1220 关路灯/P2466 Sue 的小球 题解
  • QCustomPlot安装及demo
  • 洛谷 三连击 暴力枚举
  • 如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新
  • 订单防重复提交与超时取消:AOP + 延迟队列实战
  • Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor
  • 鼎讯信通 通信安全的终极解决方案:机架式通信干扰机
  • 小白学习java第12天:IO流之缓冲流
  • 数据库守护神-WAL机制
  • 业务幂等性技术架构体系-接口幂等
  • 时序数据异常检测-综述
  • 【蓝桥杯】赛前练习
  • STM32 模块化开发指南 · 第 3 篇 环形缓冲区 RingBuffer 模块设计与单元测试
  • WHAT - React 安全地订阅外部状态源 - useSyncExternalStore
  • 我的Hexo自动Webhook部署方案
  • tree-sitter 的 grammar.js 编写方法
  • 如何进行预算考核
  • Ubuntu22环境下,Docker部署阿里FunASR的gpu版本
  • 【力扣hot100题】(085)单词拆分
  • 做网站推广需要什么/淘宝指数官网的网址
  • 用.net做网站好_还是用php/百度网盘云资源搜索引擎
  • 宜春做网站公司怎么样/网站设计与开发
  • 做网站是要编程吗/免费网站推广平台
  • 电子商务网站建设的规划书/好看的友情链接代码
  • 网站qq 微信分享怎么做的/营销型网站的推广方法