opengl嵌入到qt中

OpenGL嵌入到Qt中

分类: Qt   211人阅读  评论(0)  收藏  举报

将OpenGL嵌入到Qt中的流程如下:

 

nehewidget.h

 

[c-sharp]  view plain copy print ?
  1. #ifndef NEHEWIDGET_H  
  2. #define NEHEWIDGET_H  
  3. #include <Qt/qgl.h>  
  4.   
  5. class NeHeWidget : public QGLWidget  
  6. {  
  7.     Q_OBJECT  
  8.   
  9. public:  
  10.   
  11.   NeHeWidget( QWidget* parent = 0, const char* name = 0, bool fs = false );  
  12.   ~NeHeWidget();  
  13.   
  14. protected:  
  15.   
  16.   void initializeGL();  
  17.   void paintGL();  
  18.   void resizeGL( int width, int height );  
  19.   
  20.   void keyPressEvent( QKeyEvent *e );  
  21.   void loadGLTextures();  
  22.   
  23. protected:  
  24.   
  25.   bool fullscreen;  
  26.   GLfloat xRot, yRot, zRot;  
  27.   GLfloat zoom;  
  28.   GLfloat xSpeed, ySpeed;  
  29.   GLuint texture[3];  
  30.   GLuint filter;  
  31.   
  32.   bool light;  
  33. };  
  34.  
  35. #endif // NEHEWIDGET_H  

 

nehewidget.cpp

 

[c-sharp]  view plain copy print ?
  1. #include <QtGui/QApplication>  
  2. #include <QtGui/QMainWindow>  
  3. #include <QtGui/QWidget>  
  4. #include <QtGui/QImage.h>  
  5. #include <QtGui/qevent.h>  
  6.  
  7. #include "nehewidget.h"  
  8.   
  9. GLfloat lightAmbient[4] = { 0.5, 0.5, 0.5, 1.0 };  
  10. GLfloat lightDiffuse[4] = { 1.0, 1.0, 1.0, 1.0 };  
  11. GLfloat lightPosition[4] = { 0.0, 0.0, 2.0, 1.0 };  
  12.   
  13. NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs )  
  14.     : QGLWidget( parent/*, name */)  
  15. {  
  16.   xRot = yRot = zRot = 0.0;  
  17.   zoom = -5.0;  
  18.   xSpeed = ySpeed = 0.0;  
  19.   
  20.   filter = 0;  
  21.   
  22.   light = false;  
  23.   
  24.   fullscreen = fs;  
  25.   setGeometry( 100, 100, 640, 480 );  
  26.   //setCaption("NeHe's Texture, Lighting & Keyboard Tutorial");  
  27.   
  28.   if ( fullscreen )  
  29.     showFullScreen();  
  30. }  
  31.   
  32. NeHeWidget::~NeHeWidget()  
  33. {  
  34. }  
  35.   
  36. void NeHeWidget::paintGL()  
  37. {  
  38.   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );  
  39.   glLoadIdentity();  
  40.   glTranslatef(  0.0,  0.0, zoom );  
  41.   
  42.   glRotatef( xRot,  1.0,  0.0,  0.0 );  
  43.   glRotatef( yRot,  0.0,  1.0,  0.0 );  
  44.   
  45.   glBindTexture( GL_TEXTURE_2D, texture[filter] );  
  46.   
  47.   glBegin( GL_QUADS );  
  48.     glNormal3f( 0.0, 0.0, 1.0 );  
  49.     glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );  
  50.     glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );  
  51.     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0,  1.0 );  
  52.     glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0,  1.0 );  
  53.   
  54.     glNormal3f( 0.0, 0.0, -1.0 );  
  55.     glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );  
  56.     glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );  
  57.     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );  
  58.     glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 );  
  59.   
  60.     glNormal3f( 0.0, 1.0, 0.0 );  
  61.     glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );  
  62.     glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0,  1.0,  1.0 );  
  63.     glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0,  1.0,  1.0 );  
  64.     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );  
  65.   
  66.     glNormal3f( 0.0, -1.0, 0.0 );  
  67.     glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 );  
  68.     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0, -1.0, -1.0 );  
  69.     glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );  
  70.     glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );  
  71.   
  72.     glNormal3f( 1.0, 0.0, 0.0 );  
  73.     glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 );  
  74.     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );  
  75.     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0,  1.0,  1.0 );  
  76.     glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );  
  77.   
  78.     glNormal3f( -1.0, 0.0, 0.0 );  
  79.     glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );  
  80.     glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );  
  81.     glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0,  1.0,  1.0 );  
  82.     glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );  
  83.   glEnd();  
  84.   
  85.   xRot += xSpeed;  
  86.   yRot += ySpeed;  
  87. }  
  88.   
  89. void NeHeWidget::initializeGL()  
  90. {  
  91.   loadGLTextures();  
  92.   
  93.   glEnable( GL_TEXTURE_2D );  
  94.   glShadeModel( GL_SMOOTH );  
  95.   glClearColor( 0.0, 0.0, 0.0, 0.5 );  
  96.   glClearDepth( 1.0 );  
  97.   glEnable( GL_DEPTH_TEST );  
  98.   glDepthFunc( GL_LEQUAL );  
  99.   glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );  
  100.   
  101.   glLightfv( GL_LIGHT1, GL_AMBIENT, lightAmbient );  
  102.   glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse );  
  103.   glLightfv( GL_LIGHT1, GL_POSITION, lightPosition );  
  104.   
  105.   glEnable( GL_LIGHT1 );  
  106. }  
  107.   
  108. void NeHeWidget::resizeGL( int width, int height )  
  109. {  
  110.   if ( height == 0 )  
  111.   {  
  112.     height = 1;  
  113.   }  
  114.   glViewport( 0, 0, (GLint)width, (GLint)height );  
  115.   glMatrixMode( GL_PROJECTION );  
  116.   glLoadIdentity();  
  117.   gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );  
  118.   glMatrixMode( GL_MODELVIEW );  
  119.   glLoadIdentity();  
  120. }  
  121.   
  122. void NeHeWidget::keyPressEvent( QKeyEvent *e )  
  123. {  
  124.   switch ( e->key() )  
  125.   {  
  126.   case Qt::Key_L:  
  127.     light = !light;  
  128.     if ( !light )  
  129.     {  
  130.       glDisable( GL_LIGHTING );  
  131.     }  
  132.     else  
  133.     {  
  134.       glEnable( GL_LIGHTING );  
  135.     }  
  136.     updateGL();  
  137.     break;  
  138.   case Qt::Key_F:  
  139.     filter += 1;;  
  140.     if ( filter > 2 )  
  141.     {  
  142.       filter = 0;  
  143.     }  
  144.     updateGL();  
  145.     break;  
  146.   case Qt::Key_PageUp:  
  147.     zoom -= 0.2;  
  148.     updateGL();  
  149.     break;  
  150.   case Qt::Key_PageDown:  
  151.     zoom += 0.2;  
  152.     updateGL();  
  153.     break;  
  154.   case Qt::Key_Up:  
  155.     xSpeed -= 0.01;  
  156.     updateGL();  
  157.     break;  
  158.   case Qt::Key_Down:  
  159.     xSpeed += 0.01;  
  160.     updateGL();  
  161.     break;  
  162.   case Qt::Key_Right:  
  163.     ySpeed += 0.01;  
  164.     updateGL();  
  165.     break;  
  166.   case Qt::Key_Left:  
  167.     ySpeed -= 0.01;  
  168.     updateGL();  
  169.     break;  
  170.   case Qt::Key_F2:  
  171.     fullscreen = !fullscreen;  
  172.     if ( fullscreen )  
  173.     {  
  174.       showFullScreen();  
  175.     }  
  176.     else  
  177.     {  
  178.       showNormal();  
  179.       setGeometry( 100, 100, 640, 480 );  
  180.     }  
  181.     update();  
  182.     break;  
  183.   case Qt::Key_Escape:  
  184.     close();  
  185.   }  
  186. }  
  187.   
  188. void NeHeWidget::loadGLTextures()  
  189. {  
  190.   QImage tex, buf;  
  191.   if ( !buf.load( ":/MyPicture/Crate.bmp" ) )  
  192.   {  
  193.     qWarning( "Could not read image file, using single-color instead." );  
  194.  QImage dummy( 128, 128, /*32*/QImage::Format_Indexed8);  
  195.  dummy.fill( Qt::green );  
  196.     buf = dummy;  
  197.   }  
  198.   tex = QGLWidget::convertToGLFormat( buf );  
  199.   
  200.   glGenTextures( 3, &texture[0] );  
  201.   
  202.   glBindTexture( GL_TEXTURE_2D, texture[0] );  
  203.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );  
  204.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );  
  205.   glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,  
  206.       GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );  
  207.   
  208.   glBindTexture( GL_TEXTURE_2D, texture[1] );  
  209.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
  210.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );  
  211.   glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,  
  212.       GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );  
  213.   
  214.   glBindTexture( GL_TEXTURE_2D, texture[2] );  
  215.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
  216.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );  
  217.   gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, tex.width(), tex.height(),  
  218.       GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );  
  219. }  

 

 

main.cpp

 

 

[c-sharp]  view plain copy print ?
  1. #include <QtGui/QApplication>  
  2. #include <QtGui/QMainWindow>  
  3. #include <QtGui/QWidget>  
  4. #include <QtGui/QMessageBox>  
  5. #include <Qt/qgl.h>  
  6.  
  7. #include "nehewidget.h"  
  8.   
  9. int main( int argc, char **argv )  
  10. {  
  11.   bool fs = false;  
  12.   
  13.   QApplication a(argc,argv);  
  14.   
  15.   switch( QMessageBox::information( 0,  
  16.       "Start FullScreen?",  
  17.       "Would You Like To Run In Fullscreen Mode?",  
  18.       QMessageBox::Yes,  
  19.       QMessageBox::No | QMessageBox::Default ) )  
  20.   {  
  21.   case QMessageBox::Yes:  
  22.     fs = true;  
  23.     break;  
  24.   case QMessageBox::No:  
  25.     fs = false;  
  26.     break;  
  27.   }  
  28.   
  29.   NeHeWidget w( 0, 0, fs );  
  30.   //a.setMainWidget( &w );//QT4.X以上版本不需要了  
  31.   //a.setActiveWindow( &w );  
  32.   w.show();  
  33.   
  34.   return a.exec();  
  35. }  

 

 Qt_2.pro  这是配置文件

 

 

[c-sharp]  view plain copy print ?
  1. INCLUDEPLAT += E:/Qt/ogl/gl  
  2. LIBS += -L/E:/Qt/ogl /  
  3.     -lglu32  
  4. LIBS += -L/E:/Qt/ogl /  
  5.     -lopengl32  
  6. QT += opengl  
  7. HEADERS += nehewidget.h  
  8. SOURCES += nehewidget.cpp /  
  9.     main.cpp  
  10. RESOURCES += nehe.qrc  

 

 

nehe.qrc   这是资源文件

 

[c-sharp]  view plain copy print ?
  1. <RCC>  
  2.   <qresource prefix="MyPicture" >  
  3.      <file>Crate.bmp</file>  
  4.   </qresource>  
  5. </RCC>  

Crate.bmp是个图片

 

在QtCreator中创建一个Qt空工程,

将以上几个文件加入到工程中。

就可以编译运行了。

 

环境框架:

 

 opengl嵌入到qt中_第1张图片

 

 

 

我的实现结果:

 


opengl嵌入到qt中_第2张图片

 

你可能感兴趣的:(框架,filter,buffer,qt,qt,byte,2010)