OpenGL ES 绘制三角形(QT GUI实现)

OpenGL ES 绘制三角形(QT GUI实现)
OpenGL ES 绘制三角形(嵌入式HI3559AV平台实现 )
OpenGL ES 绘制dicom医学影像数据渲染(QT GUI 三维重建 )
OpenGL ES 绘制dicom医学影像数据渲染(嵌入式HI3559AV平台 三维重建 )

本文学习记录下OpenGL es3.0学习demo

一.实现效果

在这里插入图片描述

二.实现源码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

#include <QDebug>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class GLWidget: public QOpenGLWidget, public QOpenGLFunctions
{
    Q_OBJECT
public:
    GLWidget(QWidget *parent=nullptr);
    ~GLWidget();
protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    GLWidget *glWidget;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>


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

}

GLWidget::~GLWidget()
{

}

char vShaderStr[] =
      "#version 300 es                          \n"
      "layout(location = 0) in vec4 vPosition;  \n"
      "void main()                              \n"
      "{                                        \n"
      "   gl_Position = vPosition;              \n"
      "}                                        \n";

char fShaderStr[] =
    "#version 300 es                              \n"
    "precision mediump float;                     \n"
    "out vec4 fragColor;                          \n"
    "void main()                                  \n"
    "{                                            \n"
    "   fragColor = vec4 ( 0.7, 0.4, 0.8, 1.0 );  \n" //设置颜色,改变前面三个参数rgb
    "}\n";


void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    printf("GL version : %s\n", glGetString(GL_VERSION));
    printf("GL vendor : %s\n", glGetString(GL_VENDOR));
    printf("GL renderer : %s\n", glGetString(GL_RENDERER));
    fflush(stdout);

    unsigned int vshader_id, fshader_id;
    unsigned int program_id;
    int compiled1, compiled2;
    int ret;

    const char *ptr1 = vShaderStr;
    const char *ptr2 = fShaderStr;

    //创建着色器
    vshader_id = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vshader_id, 1, &ptr1, nullptr);

    //编译顶点着色器
    glCompileShader(vshader_id);

    //检测是否编译成功
    glGetShaderiv(vshader_id, GL_COMPILE_STATUS, &compiled1);

    if(!compiled1)
    {
        //调试打印错误信息
        GLint infoLen;
        glGetShaderiv(vshader_id, GL_INFO_LOG_LENGTH, &infoLen);
        if(infoLen>1)
        {
            char *buff = new char[infoLen];
            glGetShaderInfoLog(vshader_id, infoLen, nullptr, buff);
            std::cout<<"compiled shader failed:"<<buff<<std::endl;
            delete [] buff;
            buff = nullptr;
        }
        glDeleteShader(vshader_id);
    }

    if(!compiled1)
        qDebug()<<"vshader compiled failed";
    else
        qDebug()<<"vshader compiled1="<<compiled1;

    fshader_id = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fshader_id, 1, &ptr2, nullptr);
    glCompileShader(fshader_id);
    glGetShaderiv(fshader_id, GL_COMPILE_STATUS, &compiled2);
    if(!compiled2)
        qDebug()<<"fshader compiled failed";
    else
        qDebug()<<"fshader compiled1="<<compiled2;


    //创建一个程序对象,并链接着色器
    program_id = glCreateProgram();
    glAttachShader(program_id, vshader_id);
    glAttachShader(program_id, fshader_id);

    //链接
    glLinkProgram(program_id);

    //检测是否链接成功
    glGetProgramiv(program_id, GL_LINK_STATUS, &ret);

    if(!ret)
    {
        //调试打印错误信息
        GLint inoLen;
        glGetProgramiv(program_id, GL_INFO_LOG_LENGTH, &inoLen);
        if(inoLen>1)
        {
            char *buff = new char[inoLen];
            glGetProgramInfoLog(program_id, inoLen, nullptr, buff);
            std::cout<<"error glGetprogram link:"<<buff<<std::endl;
            delete []buff;
            buff = nullptr;
        }
        glDeleteProgram(program_id);
    }

    if(!ret)
        qDebug()<<"gl programiv link shader failed";
    else
        qDebug()<<"gl programiv link="<<ret;

    //绑定程序对象,开始渲染
    glUseProgram(program_id);
}

void GLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}

void GLWidget::paintGL()
{
    GLfloat vVertices[] = {0.0f,  0.5f, 0.0f,
                           -0.5f, -0.5f, 0.0f,
                           0.5f, -0.5f, 0.0f
                          };

   //绘画区域背景色
   glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
   // Clear the color buffer
   glClear(GL_COLOR_BUFFER_BIT);

   // Load the vertex data
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
   glEnableVertexAttribArray(0);
   glDrawArrays(GL_TRIANGLES, 0, 3);
}


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setMinimumSize(QSize(400, 400));
    this->setGeometry(0, 0, 400, 400);

    glWidget = new GLWidget(this);
    glWidget->setGeometry(0, 0, 300, 300);
    glWidget->update();                     //调用paintGL函数
}

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

man.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

实现绘制三角形,关注GLWidget类,重写三个函数

void initializeGL() override;
void paintGL() override;
void resizeGL(int w, int h) override;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值