// glwidget6.h
#ifndef GLWIDGET6_H
#define GLWIDGET6_H
#include "../glwidget.h"
class GLWidget6 : public GLWidget
{
// Q_OBJECT //! 注意:此处不能有Q_OBJECT
public:
GLWidget6(int timerInterval = 0, QWidget *parent = 0);
protected:
virtual void initializeGL();
virtual void resizeGL( int width, int height );
virtual void paintGL();
virtual void timeOut();
void loadGLTextures();
private:
GLfloat rotx, roty, rotz;
//GLuint texture[1];
GLuint texture[6];
};
#endif // GLWIDGET6_H
// glwidget6.cpp
#include "glwidget6.h"
GLWidget6::GLWidget6(int timerInterval, QWidget *parent)
: GLWidget(timerInterval, parent)
{
rotx = roty = rotz = 0.0f;
}
void GLWidget6::initializeGL()
{
loadGLTextures();
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void GLWidget6::resizeGL(int width, int height)
{
height = height?height:1;
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void GLWidget6::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(0.0f,0.0f,-5.0f); // 相对当前所在的屏幕位置移动
glRotatef(rotx, 1.0f, 0.0f, 0.0f);
glRotatef(roty, 0.0f, 1.0f, 0.0f);
glRotatef(rotz, 0.0f, 0.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
// Front face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
// Back face
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
// Top face
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glEnd();
// Bottom face
glBindTexture(GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd();
// Right face
glBindTexture(GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();
// Left face
glBindTexture(GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
}
void GLWidget6::timeOut()
{
rotx += 0.3f;
roty += 0.2f;
rotz += 0.4f;
updateGL();
}
void GLWidget6::loadGLTextures()
{
QString images[6] = {"apple1.jpg", "apple.jpg", "FreeBSD.png","Hacker2.png", "nehe.bmp", "w2.jpg"};
glGenTextures(6, &texture[0]);
for (int i = 0; i < 6; ++i) {
QImage t;
//! 注意: 图片的宽度和高度必须为2的N次方
QImage b(":/images/" + images[i]);
t = QGLWidget::convertToGLFormat(b);
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
}
// main.cpp
#include "glwidget6.h"
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(GLWidget6);
QApplication a(argc, argv);
GLWidget *w = new GLWidget6(30);
w->show();
GLWidget *w2 = new GLWidget6(25);
w2->show();
return a.exec();
}
// GLWidget6.pro
######################################################################
# Automatically generated by qmake (2.01a) ?? 6? 17 21:35:24 2010
######################################################################
QT += opengl
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += glwidget6.h ../glwidget.h
SOURCES += glwidget6.cpp main.cpp ../glwidget.cpp
RESOURCES += GLWidget6.qrc
// GLWidget6.qrc
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/apple1.jpg</file>
<file>images/apple.jpg</file>
<file>images/FreeBSD.png</file>
<file>images/Hacker2.png</file>
<file>images/nehe.bmp</file>
<file>images/w2.jpg</file>
</qresource>
</RCC>