glVertex3f(-1.0, 1.0, 0.0);
glEnd();
}
/*不闪烁时*/
glRotatef(spin, 0.0, 0.0, 1.0);//星星沿z轴自转spin度
glColor4ub(star[loop].r, star[loop].g, star[loop].b, 255);//采用的是自己的颜色,完全不透明
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, 0.0);
glEnd();
spin += 0.01f;
star[loop].angle += float(loop)/num;//角度是在慢慢增大的
star[loop].dist -= 0.01f;//距离慢慢减小,被吸向了屏幕中心
if(star[loop].dist < 0)
{
star[loop].dist += 5.0f;
star[loop].r = rand()%256;
star[loop].g = rand()%256;
star[loop].b = rand()%256;
}
}
}
//该程序是设置opengl场景透视图,程序中至少被执行一次(程序启动时).
void GLWidget::resizeGL(int width, int height)
{
if(0 == height)
height = 1;//防止一条边为0
glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置选择好的投影矩阵
gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glMatrixMode(GL_MODELVIEW);//以下2句和上面出现的解释一样
glLoadIdentity();
}
void GLWidget::keyPressEvent(QKeyEvent *e)
{
switch(e->key())
{
/*PageUp键为将木箱移到屏幕内部方向*/
case Qt::Key_T:
twinkle = !twinkle;
updateGL();
break;
/*B键位选择是否采用色彩融合*/
case Qt::Key_B:
blend = !blend;
if(blend)
{
glEnable(GL_BLEND);//色彩融合和深度缓存不能同时开启
glDisable(GL_DEPTH_TEST);
}
else
{
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
}
updateGL();
break;
/*PageUp键为将木箱移到屏幕内部方向*/
case Qt::Key_PageUp:
zoom -= 0.2;
updateGL();
break;
/*PageDown键为将木箱移到屏幕外部方向*/
case Qt::Key_PageDown:
zoom += 0.2;
updateGL();
break;
/*Up键为加快立方体旋转的速度*/
case Qt::Key_Up:
title += 0.5;
updateGL();
break;
/*Down键为减慢立方体旋转的速度*/
case Qt::Key_Down:
title -= 0.5;
updateGL();
break;
/*F1键为全屏和普通屏显示切换键*/
case Qt::Key_F1:
fullscreen = !fullscreen;
if(fullscreen)
showFullScreen();
else
{
setGeometry(300, 150, 500, 500);
showNormal();
}
updateGL();
break;
/*Ese为退出程序键*/
case Qt::Key_Escape:
close();
}
}
/*装载纹理*/
void GLWidget::loadGLTextures()
{
QImage tex, buf;
if(!buf.load(":/images/2.bmp"))//这个时候因为debug没有在外面,所以图片文件夹就是本目录了
// if(!buf.load("../opengl_qt_nehe_07/crate.bmp"))
{
qWarning("Cannot open the image...");
QImage dummy(128, 128, QImage::Format_RGB32);//当没找到所需打开的图片时,创建一副128*128大小,深度为32位的位图
dummy.fill(Qt::green);
buf = dummy;
}
tex = convertToGLFormat(buf);//将Qt图片的格式buf转换成opengl的图片格式tex
glGenTextures(1, &texture[0]);//开辟3个纹理内存,索引指向texture[0]
/*建立第一个纹理*/
glBindTexture(GL_TEXTURE_2D, texture[0]);//将创建的纹理内存指向的内容绑定到纹理对象GL_TEXTURE_2D上,经过这句代码后,以后对
//GL_TEXTURE_2D的操作的任何操作都同时对应与它所绑定的纹理对象
glT