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;