QT學習OpenGL序列 HelloShaders

2021-10-03 21:25:12 字數 4154 閱讀 1620

學習opengl sharder(注意opengl 3.3版本以上支援)

(1) 標頭檔案

#ifndef copenglwidgethelloshaders_h

#define copenglwidgethelloshaders_h

/* * 控制項名稱:hello shaders

* ** 注意:std c++ version >= c++11

* * author: hsw

**/#include // opengl函式

#include #include #include class copenglwidgethelloshaders : public qopenglwidget, public qopenglfunctions

;#endif // copenglwidgethelloshaders_h

#ifndef mainwindow_h

#define mainwindow_h

#include "copenglwidgethelloshaders.h"

#include namespace ui

class mainwindow : public qmainwindow

;#endif // mainwindow_h

(2) cpp 檔案

#include "copenglwidgethelloshaders.h"

copenglwidgethelloshaders::copenglwidgethelloshaders(int mode, qwidget *parent) : qopenglwidget(parent)

copenglwidgethelloshaders::~copenglwidgethelloshaders()

void copenglwidgethelloshaders::initializegl()

\n");

}else if(m_mode == 1)

\n");

}else if(m_mode == 2 || m_mode == 3)

\n");

}m_pvshader->compilesourcecode(vshadersrc);

// 初始化片段著色器

m_pfshader = new qopenglshader(qopenglshader::fragment);

//// 注意:頂點著色器輸出的顏色的變數名稱 和 片段著色器輸入的顏色的變數名稱必須相同

//qstring fshadersrc;

if(m_mode == 0)

\n");

}else if(m_mode == 1)

\n");

}else if(m_mode == 2 || m_mode == 3)

\n");

}m_pfshader->compilesourcecode(fshadersrc);

// 初始化著色器管理物件

m_pshaderprogram = new qopenglshaderprogram;

m_pshaderprogram->addshader(m_pvshader);

m_pshaderprogram->addshader(m_pfshader);

bool ret = m_pshaderprogram->link();

if(ret == false)

if(m_mode == 0)

else if(m_mode == 1)

else if(m_mode == 2 || m_mode == 3)

}// 視窗調整

void copenglwidgethelloshaders::resizegl(int width, int height)

// 視窗重新繪製

// 注意:呼叫update()和paintevent()時都會自動呼叫paintgl()

//void copenglwidgethelloshaders::paintgl()

else if(m_pshaderprogram->islinked() && m_mode == 1)

else if(m_pshaderprogram->islinked() && (m_mode == 2 || m_mode == 3))

gldisable(gl_depth_test);

painter.endnativepainting();

// qt 繪製

painter.setpen(qt::green);

qstring textinfo = qstring("按\"esc\"退出");

painter.drawtext(25, 25, textinfo);

painter.end();

}bool copenglwidgethelloshaders::eventfilter(qobject *obj, qevent * event)}}

}return false;

}void copenglwidgethelloshaders::m_paint********()

; // 頂點緩衝區建立

m_vbufferobject.create();

m_vbufferobject.bind();

m_vbufferobject.allocate(9 * sizeof(float));

m_vbufferobject.write(0, vertices, sizeof(vertices));

m_vbufferobject.release();

}else if(!m_vbufferobject.iscreated() && m_mode == 1)

;// 頂點緩衝區建立

m_vbufferobject.create();

m_vbufferobject.bind();

m_vbufferobject.allocate(9 * sizeof(float));

m_vbufferobject.write(0, vertices, sizeof(vertices));

m_vbufferobject.release();

}else if(!m_vbufferobject.iscreated() && m_mode == 2)

;// 三角形顏色

static float colors =

;// 頂點緩衝區建立

m_vbufferobject.create();

m_vbufferobject.bind();

m_vbufferobject.allocate(9 * 2 * sizeof(float));

m_vbufferobject.write(0, vertices, sizeof(vertices));

m_vbufferobject.write(sizeof(vertices), colors, sizeof(colors));

m_vbufferobject.release();

}else if(!m_vbufferobject.iscreated() && m_mode == 3)

;// 頂點緩衝區建立

m_vbufferobject.create();

m_vbufferobject.bind();

m_vbufferobject.allocate(6 * 3 * sizeof(float));

m_vbufferobject.write(0, vertices, sizeof(vertices));

m_vbufferobject.release();

}if(m_mode == 0 || m_mode == 1)

else if(m_mode == 2)

else if(m_mode == 3)

}

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

(3) 效果(待補充)

QT 學習OpenGL序列 Helloworld

本序列幾乎是按照learnopengl在qt上進行實現 1 標頭檔案 ifndef copenglwidgethellowidget h define copenglwidgethellowidget h 控制項名稱 hello qopenglwidget 注意 std c version c 11...

qt環境下學習OpenGL

當你開始選在在linux平台,或者其他非windows平台搗鼓opengl的時候,你就會感受到了opengl比dx強大的地方了。切入正題。其次,你完全可以搬nehe教程 該教程是在win平台的 來學習,opengl是支援跨平台的。而你程式無法執行都是非gl函式造成的。如果你是在qt下的話,你可以參考...

QT學習VTK序列 Cone

學習vtk繪製圓錐體 vtkconesource 表示生成圓錐資料,其中,圓錐資料報含幾個部分 1 底面圓中心 2 底面半徑 3 圓錐角度 和半徑相似的功能 4 圓錐高度 5 圓錐角度 setcenter 設定圓底面中心位置 setradius 設定圓底面半徑 setangle 設定圓錐頂角,單位為...