一、简介
最近想了解些Qt的OpenGL编程,可能以后会使用。Opengl是对2D和3D图形支持很好,有非常多的优化函数,而且是个跨平台的开源库。Qt的Opengl封装的很好,通过Qt的QGLWidget类,将opengl的函数和Qt的界面结合了起来。所以使用Qt开发opengl的界面类都继承自QGLWidget,如class GLWidget : public QGLWidget。
二、详解
1、代码
在pro文件中增加QT += opengl(1)widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtOpenGL/QtOpenGL>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(QWidget *parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
~GLWidget();
signals:
public slots:
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void mouseDoubleClickEvent( QMouseEvent *event );
void keyPressEvent(QKeyEvent *e);
private:
GLfloat Point[5][3];
};
#endif // WIDGET_H
(2)widget.cpp
#include "widget.h"
const GLfloat PI = 3.1415926536f;
GLWidget::GLWidget(QWidget * parent, const QGLWidget * shareWidget, Qt::WindowFlags f)
{
setMinimumSize(320,240);
resize(640,480);
setWindowTitle(tr("第一个OpenGL程序"));
short angle = 18;
for(short i=0; i<5; i++) {
Point[i][0] = cos(angle * PI/180);
Point[i][1] = sin(angle * PI/180);
Point[i][2] = 0.0;
angle += 72;
}
}
GLWidget::~GLWidget()
{
}
void GLWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, Point);
}
void GLWidget::paintGL()
{
qDebug()<<"----------paintGL---------";
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glTranslatef( -1.5, 0.0, -6.0 );
glBegin( GL_TRIANGLES );
glVertex3f( 0.0, 1.0, 0.0 );
glVertex3f( -1.0, -1.0, 0.0 );
glVertex3f( 1.0, -1.0, 0.0 );
glEnd();
glTranslatef( 3.0, 0.0, 0.0 );
//glDrawArrays(GL_LINE_LOOP, 0, 5);
glBegin(GL_LINE_LOOP);
glArrayElement(1);
glArrayElement(4);
glArrayElement(2);
glArrayElement(0);
glArrayElement(3);
glEnd();
}
void GLWidget::resizeGL(int width, int height)
{
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void GLWidget::mouseDoubleClickEvent( QMouseEvent *event )
{
if(windowState() & Qt::WindowFullScreen)
showNormal();
else
showFullScreen();
}
void GLWidget::keyPressEvent(QKeyEvent *e)
{
if (e->key() == Qt::Key_Escape)
close();
}
(3)main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
GLWidget w;
w.show();
return a.exec();
}
2、Qt的Opengl教程
参考网站:
http://qiliang.net/old/nehe_qt/require.html参考NeHe的OpenGL教程: http://nehe.gamedev.net/
Qt OpenGL的准备工作
第一课:创建一个OpenGL窗口
第二课:你的第一个多边形
第三课:上色
第四课:旋转
第五课:向三维进军
第六课:纹理映射
第七课:纹理滤波、光源和键盘控制
第八课:融合
第九课:在三维空间中移动位图
第十课:载入一个三维世界并在其中移动
第十一课:旗的效果(波动纹理)
第十二课:显示列表
第十三课:位图字体
第十四课:轮廓字体
第十五课:使用纹理映射的轮廓字体
第十六课:看起来很棒的雾
三、总结
(1)上述代码仅是测试代码,主要是存放网络上的一些参考教程,以便以后的查阅。(2)测试代码已上传到csdn :http://download.csdn.net/detail/taiyang1987912/9507466。
(2)若有问题或建议,请留言,在此感谢!