學習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 設定圓錐頂角,單位為...