2015-01-13 21 views
0

我想通過qt-project提供的教程學習Qt OpenGL。 我需要編寫一個可以在Windows和Mac上運行的應用程序。但是我可能會遇到他們給出的例子的一個問題:使用glext.h庫時,他們指定操作系統是windows(WIN32的東西)。現在我不確定他們的示例可以在Mac上運行。他們甚至說,在教程:對於Windows和Mac的glext.h

"glActiveTexture() and GL_TEXTUREi can then be used on Windows."

這裏是他們的代碼:

#include "glwidget.h" 
#include <QMouseEvent> 
#include <QWheelEvent> 

//! [0] 
#ifdef WIN32 
    #include <GL/glext.h> 
    PFNGLACTIVETEXTUREPROC pGlActiveTexture = NULL; 
    #define glActiveTexture pGlActiveTexture 
#endif //WIN32 
//! [0] 

GlWidget::GlWidget(QWidget *parent) 
    : QGLWidget(QGLFormat(/* Additional format options */), parent) 
{ 
    alpha = 25; 
    beta = -25; 
    distance = 2.5; 
} 

GlWidget::~GlWidget() 
{ 
} 

QSize GlWidget::sizeHint() const 
{ 
    return QSize(640, 480); 
} 

//! [1] 
void GlWidget::initializeGL() 
{ 
    //! [1] 
    //! [2] 
    #ifdef WIN32 
     glActiveTexture = (PFNGLACTIVETEXTUREPROC) wglGetProcAddress((LPCSTR) "glActiveTexture"); 
    #endif 
    //! [2] 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 

    qglClearColor(QColor(Qt::black)); 

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh"); 
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh"); 
    shaderProgram.link(); 

    vertices << QVector3D(-0.5, -0.5, 0.5) << QVector3D(0.5, -0.5, 0.5) << QVector3D(0.5, 0.5, 0.5) // Front 
      << QVector3D(0.5, 0.5, 0.5) << QVector3D(-0.5, 0.5, 0.5) << QVector3D(-0.5, -0.5, 0.5) 
      << QVector3D(0.5, -0.5, -0.5) << QVector3D(-0.5, -0.5, -0.5) << QVector3D(-0.5, 0.5, -0.5) // Back 
      << QVector3D(-0.5, 0.5, -0.5) << QVector3D(0.5, 0.5, -0.5) << QVector3D(0.5, -0.5, -0.5) 
      << QVector3D(-0.5, -0.5, -0.5) << QVector3D(-0.5, -0.5, 0.5) << QVector3D(-0.5, 0.5, 0.5) // Left 
      << QVector3D(-0.5, 0.5, 0.5) << QVector3D(-0.5, 0.5, -0.5) << QVector3D(-0.5, -0.5, -0.5) 
      << QVector3D(0.5, -0.5, 0.5) << QVector3D(0.5, -0.5, -0.5) << QVector3D(0.5, 0.5, -0.5) // Right 
      << QVector3D(0.5, 0.5, -0.5) << QVector3D(0.5, 0.5, 0.5) << QVector3D(0.5, -0.5, 0.5) 
      << QVector3D(-0.5, 0.5, 0.5) << QVector3D(0.5, 0.5, 0.5) << QVector3D(0.5, 0.5, -0.5) // Top 
      << QVector3D(0.5, 0.5, -0.5) << QVector3D(-0.5, 0.5, -0.5) << QVector3D(-0.5, 0.5, 0.5) 
      << QVector3D(-0.5, -0.5, -0.5) << QVector3D(0.5, -0.5, -0.5) << QVector3D(0.5, -0.5, 0.5) // Bottom 
      << QVector3D(0.5, -0.5, 0.5) << QVector3D(-0.5, -0.5, 0.5) << QVector3D(-0.5, -0.5, -0.5); 
    //! [3] 
    textureCoordinates << QVector2D(0, 0) << QVector2D(.5, 0) << QVector2D(.5, .5) // Front 
         << QVector2D(.5, .5) << QVector2D(0, .5) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Back 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Left 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Right 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Top 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Bottom 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0); 

    texture = bindTexture(QPixmap(":/texture.png")); 
    //! [3] 
    //! [4] 
} 
//! [4] 

void GlWidget::resizeGL(int width, int height) 
{ 
    if (height == 0) { 
     height = 1; 
    } 

    pMatrix.setToIdentity(); 
    pMatrix.perspective(60.0, (float) width/(float) height, 0.001, 1000); 

    glViewport(0, 0, width, height); 
} 

//! [5] 
void GlWidget::paintGL() 
{ 
    //! [5] 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    QMatrix4x4 mMatrix; 
    QMatrix4x4 vMatrix; 

    QMatrix4x4 cameraTransformation; 
    cameraTransformation.rotate(alpha, 0, 1, 0); 
    cameraTransformation.rotate(beta, 1, 0, 0); 

    QVector3D cameraPosition = cameraTransformation * QVector3D(0, 0, distance); 
    QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0); 

    vMatrix.lookAt(cameraPosition, QVector3D(0, 0, 0), cameraUpDirection); 

    //! [6] 
    shaderProgram.bind(); 

    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix); 

    shaderProgram.setUniformValue("texture", 0); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glActiveTexture(0); 

    shaderProgram.setAttributeArray("vertex", vertices.constData()); 
    shaderProgram.enableAttributeArray("vertex"); 

    shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData()); 
    shaderProgram.enableAttributeArray("textureCoordinate"); 

    glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 

    shaderProgram.disableAttributeArray("vertex"); 

    shaderProgram.disableAttributeArray("textureCoordinate"); 

    shaderProgram.release(); 
} 
//! [6] 

void GlWidget::mousePressEvent(QMouseEvent *event) 
{ 
    lastMousePosition = event->pos(); 

    event->accept(); 
} 

void GlWidget::mouseMoveEvent(QMouseEvent *event) 
{ 
    int deltaX = event->x() - lastMousePosition.x(); 
    int deltaY = event->y() - lastMousePosition.y(); 

    if (event->buttons() & Qt::LeftButton) { 
     alpha -= deltaX; 
     while (alpha < 0) { 
      alpha += 360; 
     } 
     while (alpha >= 360) { 
      alpha -= 360; 
     } 

     beta -= deltaY; 
     if (beta < -90) { 
      beta = -90; 
     } 
     if (beta > 90) { 
      beta = 90; 
     } 

     updateGL(); 
    } 

    lastMousePosition = event->pos(); 

    event->accept(); 
} 

void GlWidget::wheelEvent(QWheelEvent *event) 
{ 
    int delta = event->delta(); 

    if (event->orientation() == Qt::Vertical) { 
     if (delta < 0) { 
      distance *= 1.1; 
     } else if (delta > 0) { 
      distance *= 0.9; 
     } 

     updateGL(); 
    } 

    event->accept(); 
} 

等都可以在Mac上運行這個?如果不能,我應該改變什麼?

+0

「但我_may_有問題」 ......也許你可以試試。那麼,如果有什麼問題,你可以問一個更具體的問題。 –

+0

我會,如果我可以。我沒有Mac,也沒有任何我知道的人。所以我需要知道這個代碼是否會導致問題。因爲本教程沒有提到有關Mac的一句話。 – Laetan

+0

那麼如何讓你知道你是否成功地讓它在兩個平臺上運行? –

回答

1

在MacOS X上,您不需要glext.h,因爲可用的(最大)OpenGL版本取決於操作系統版本。所以當用例如優勝美地SDK已經涵蓋了OpenGL-4。

Windows是不同的。聲稱支持的唯一OpenGL版本是Windows Vista之前的OpenGL-1.1以及Vista之後的OpenGL-1.4;所有Windows版本支持的唯一ABI是OpenGL-1.1。所以你必須使用擴展機制來獲得更多的功能。

* nix系統是相似的,區別的共同基礎是OpenGL的1.2