Почему программа не работает???
Компилируется без ошибок, а запускаться не хочет!!!
На форуме программистов молчат!
Код программы:
mainwindow.h
#include <QMainWindow>
#include <GL/glut.h>
#include <GL/glu.h>
#include <QTimer>
#include <QGLWidget>
class OpenGLClass : public QGLWidget {
Q_OBJECT
private:
bool light;
GLfloat xrot;
GLfloat yrot;
GLfloat xspeed;
GLfloat yspeed;
GLfloat z;
GLfloat LightAmbient[4];
GLfloat LightDiffuse[4];
GLfloat LightPosition[4];
GLuint filter;
GLuint texture[3];
protected:
virtual void initializeGL();
virtual void resizeGL(int nWidth, int nHeight);
virtual void paintGL();
void keyPressEvent(QKeyEvent * pe);
public:
void LoadTextures();
OpenGLClass(QWidget * pwgt = 0);
public slots:
void change();
};
main.cpp
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char** argv) {
QApplication app(argc, argv);
OpenGLClass gl;
gl.resize(400, 400);
gl.show();
return app.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include <QKeyEvent>
#include <QTimer>
#include <GL/glut.h>
#include <GL/glu.h>
OpenGLClass::OpenGLClass(QWidget * pwgt) :
xrot(0), yrot(0), xspeed(0), yspeed(0), z(-5.0f) {
LightAmbient[0] = 0.5f;
LightAmbient[1] = 0.5f;
LightAmbient[2] = 0.5f;
LightAmbient[3] = 1.0f;
LightDiffuse[0] = 1.0f;
LightDiffuse[1] = 1.0f;
LightDiffuse[2] = 1.0f;
LightDiffuse[3] = 1.0f;
LightPosition[0] = 0.0f;
LightPosition[1] = 0.0f;
LightPosition[2] = 2.0f;
LightPosition[3] = 1.0f;
QTimer * timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(change()));
timer -> start(20);
}
void OpenGLClass::change() {
xrot += xspeed;
yrot += yspeed;
updateGL();
}
void OpenGLClass::resizeGL(int nWidth, int nHeight) {
glViewport(0, 0, (GLint)nWidth, (GLint)nHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)nWidth / (GLfloat)nHeight, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
void OpenGLClass::LoadTextures() {
QImage im = QImage("images.jpeg");
if(!im.isNull()) {
glGenTextures(3, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, im.width(), im.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, im.bits());
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, im.width(), im.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, im.bits());
glBindTexture(GL_TEXTURE_2D, texture[2]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, im.width(), im.height(), GL_RGBA, GL_UNSIGNED_BYTE, im.bits());
}
}
void OpenGLClass::initializeGL() {
LoadTextures();
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glEnable(GL_LIGHT0);
}
void OpenGLClass::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, z);
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, texture[filter]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.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);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glNormal3f(0.0f, 0.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);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glNormal3f(0.0f, 1.0f, 0.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);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glNormal3f(0.0f, -1.0f, 0.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);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glNormal3f(1.0f, 0.0f, 0.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);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glNormal3f(-1.0f, 0.0f, 0.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);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
}
void OpenGLClass::keyPressEvent(QKeyEvent * pe) {
switch(pe -> key()) {
case Qt::Key_L:
light = !light;
if(!light)
glDisable(GL_LIGHTING);
else
glEnable(GL_LIGHTING);
break;
case Qt::Key_F:
filter += 1;
if(filter > 2)
filter = 0;
break;
case Qt::Key_W:
z -= 0.02f;
break;
case Qt::Key_S:
z += 0.02f;
break;
case Qt::Key_Up:
xspeed -= 0.01f;
break;
case Qt::Key_Down:
xspeed += 0.01f;
break;
case Qt::Key_Right:
yspeed += 0.01f;
break;
case Qt::Key_Left:
yspeed -= 0.01f;
break;
}
updateGL();
}