Qt下使用OpenGL(20)-根据NeHe的教程改写的
2014-04-13 21:27
495 查看
第二十课:蒙板
在第七课的代码基础上修改。
nehewidget.h
nehewidget.cpp
在第七课的代码基础上修改。
nehewidget.h
#ifndef NEHEWIDGET_H #define NEHEWIDGET_H #include <QtOpenGL/QGLWidget> #include "ui_nehewidget.h" class nehewidget : public QGLWidget { Q_OBJECT public: nehewidget(QWidget *parent = 0); ~nehewidget(); protected: void initializeGL(); void paintGL(); void resizeGL(int w,int h); void loadGLTextures(); bool masking; // 是否使用“掩模” bool scene; // 绘制那一个场景 GLuint texture[3]; // 保存5个纹理标志 GLuint loop; // 循环变量 GLfloat roll; // 滚动纹理 }; #endif // NEHEWIDGET_H
nehewidget.cpp
#include "nehewidget.h" nehewidget::nehewidget(QWidget *parent) : QGLWidget(parent) { masking=TRUE; roll = 0; scene=true; } nehewidget::~nehewidget() { } void nehewidget::initializeGL() { loadGLTextures(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0,0,0,0); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); } void nehewidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择Logo纹理 glBegin(GL_QUADS); // 绘制纹理四边形 glTexCoord2f(0.0f, -roll+0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glTexCoord2f(3.0f, -roll+0.0f); glVertex3f( 0.6f, -0.6f, 0.0f); glTexCoord2f(3.0f, -roll+3.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glTexCoord2f(0.0f, -roll+3.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glEnd(); glEnable(GL_BLEND); // 启用混合 glDisable(GL_DEPTH_TEST); // 禁用深度测试 if(masking) { glBlendFunc(GL_DST_COLOR,GL_ZERO); } if(scene) { glTranslatef(0.0f,0.0f,-1.0f); // 移入屏幕一个单位 glRotatef(roll*360,0.0f,0.0f,1.0f); // 沿Z轴旋转 if(masking) { glBindTexture(GL_TEXTURE_2D, texture[1]); // 选择第二个“掩模”纹理 glBegin(GL_QUADS); // 开始绘制四边形 glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.6f, -0.6f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glEnd(); } glBlendFunc(GL_ONE, GL_ONE); // 把纹理2复制到屏幕 glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择第二个纹理 glBegin(GL_QUADS); // 绘制四边形 glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.6f, -0.6f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glEnd(); } else { if(masking) { glBindTexture(GL_TEXTURE_2D, texture[1]); // 选择第一个“掩模”纹理 glBegin(GL_QUADS); // 开始绘制四边形 glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 0.6f, -0.6f, 0.0f); glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glEnd(); } glBlendFunc(GL_ONE, GL_ONE); // 把纹理1复制到屏幕 glBindTexture(GL_TEXTURE_2D, texture[2]); // 选择第一个纹理 glBegin(GL_QUADS); // 开始绘制四边形 glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 0.6f, -0.6f, 0.0f); glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glEnd(); } glEnable(GL_DEPTH_TEST); // 启用深度测试 glDisable(GL_BLEND); // 禁用混合 roll+=0.002f; // 增加纹理滚动变量 if(roll>1.0f) roll-=1.0f; } void nehewidget::resizeGL(int w,int h) { if(h==0) h=1; glViewport(0,0,(GLint)w,(GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //下面这个函数在Qt和OpenGL新版本中都不支持了!先注释掉吧,以后不得不用时再想办法 // gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void nehewidget::loadGLTextures() { QImage tex,buf; if(!buf.load("texture.bmp")) { qWarning("Please use single-color instead"); QImage dummy(128,128,QImage::Format_RGB32); dummy.fill(Qt::red); buf=dummy; } tex=QGLWidget::convertToGLFormat(buf); glGenTextures(3,&texture[0]); glBindTexture(GL_TEXTURE_2D,texture[0]); glTexImage2D(GL_TEXTURE_2D,0,3,tex.width(),tex.height(),0,GL_RGB,GL_UNSIGNED_BYTE,tex.bits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glBindTexture(GL_TEXTURE_2D,texture[1]); glTexImage2D(GL_TEXTURE_2D,0,3,tex.width(),tex.height(),0,GL_RGB,GL_UNSIGNED_BYTE,tex.bits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glBindTexture(GL_TEXTURE_2D,texture[2]); glTexImage2D(GL_TEXTURE_2D,0,3,tex.width(),tex.height(),0,GL_RGB,GL_UNSIGNED_BYTE,tex.bits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,tex.width(),tex.height(),GL_RGBA,GL_UNSIGNED_BYTE,tex.bits()); }
相关文章推荐
- Qt下使用OpenGL(3)-根据NeHe的教程改写的
- Qt下使用OpenGL(21)-根据NeHe的教程改写的
- Qt下使用OpenGL(1)-根据NeHe的教程改写的
- Qt下使用OpenGL(7)-根据NeHe的教程改写的
- Qt下使用OpenGL(12)-根据NeHe的教程改写的
- Qt下使用OpenGL(22)-根据NeHe的教程改写的
- Qt下使用OpenGL(4)-根据NeHe的教程改写的
- Qt下使用OpenGL(8)-根据NeHe的教程改写的
- Qt下使用OpenGL(9)-根据NeHe的教程改写的
- Qt下使用OpenGL(18)-根据NeHe的教程改写的
- Qt下使用OpenGL(5)-根据NeHe的教程改写的
- Qt下使用OpenGL(23)-根据NeHe的教程改写的
- Qt下使用OpenGL(14)-根据NeHe的教程改写的
- Qt下使用OpenGL(19)-根据NeHe的教程改写的
- Qt下使用OpenGL(10)-根据NeHe的教程改写的
- Qt下使用OpenGL(11)-根据NeHe的教程改写的
- Qt下使用OpenGL(15)-根据NeHe的教程改写的
- Qt下使用OpenGL(6)-根据NeHe的教程改写的
- Qt下使用OpenGL(16)-根据NeHe的教程改写的
- Qt下使用OpenGL(2)-根据NeHe的教程改写的