2012-05-21 27 views
1

我試圖在Qt中使用OpenGL創建一個空間,現在我被卡住了紋理部分。它不會將我的紋理放在牆上。在Qt中使用OpenGL進行紋理加載

這是我的代碼:

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent):QGLWidget(parent) 
{ 

    camPosx = 0.0, camPosy = 0.0, camPosz = 1.0; 
    camViewx = 0.0, camViewy = 0.0, camViewz = 0.0; 
    camUpx = 0.0, camUpy = 1.0, camUpz = 0.0; 
    timer = new QTimer(); 
    connect(timer, SIGNAL(timeout()), this, SLOT(updateGL())); 
} 

void GLWidget::initializeGL() { 

    loadGLTextures(); 
    glEnable(GL_TEXTURE_2D); 
    glClearColor(1.0f,1.0f,1.0f,0.0f); 
    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    timer->start(50); 
} 

void GLWidget::resizeGL(int width, int height) { 

    //set viewport 
    glViewport(0,0,width,height); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    //set persepective 
    //change the next line order to have a different perspective 
    GLdouble aspect_ratio=(GLdouble)width/(GLdouble)height; 
    gluPerspective(45.0f, aspect_ratio, 0.1 , 100.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void GLWidget::paintGL() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 

    // store current matrix 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    gluLookAt(camPosx ,camPosy ,camPosz, 
       camViewx,camViewy,camViewz, 
       camUpx, camUpy, camUpz); 

    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glScalef(2.0,2.0,2.0); 
    glBegin(GL_QUADS); 
    /* Floor */ 
    glColor3f(0,0,0); 
    glVertex3f(-1,-1,-1); 
    glVertex3f(1,-1,-1); 
    glVertex3f(1,-1,1); 
    glVertex3f(-1,-1,1); 
    /* Ceiling */ 
    glVertex3f(-1,1,-1); 
    glVertex3f(1,1,-1); 
    glVertex3f(1,1,1); 
    glVertex3f(-1,1,1); 
    /* Walls */ 
    glVertex3f(-1,-1,1); 
    glVertex3f(1,-1,1); 
    glVertex3f(1,1,1); 
    glVertex3f(-1,1,1); 

    glVertex3f(-1,-1,-1); 
    glVertex3f(1,-1,-1); 
    glVertex3f(1,1,-1); 
    glVertex3f(-1,1,-1); 

    glVertex3f(1,1,1); 
    glVertex3f(1,-1,1); 
    glVertex3f(1,-1,-1); 
    glVertex3f(1,1,-1); 

    glVertex3f(-1,1,1); 
    glVertex3f(-1,-1,1); 
    glVertex3f(-1,-1,-1); 
    glVertex3f(-1,1,-1); 
    glEnd(); 
    glEnable(GL_LIGHTING); 


    // restore current matrix 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 

} 
void GLWidget::loadGLTextures() 
{ 
    QImage t; 
    QImage b; 

    if (!b.load("images/Naamloos.bmp")) 
    { 
     qDebug("Didn't found the image."); 
     b = QImage(16, 16, QImage::Format_RGB32); 
     b.fill(1); 
    } 

    t = QGLWidget::convertToGLFormat(b); 
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
} 

void GLWidget::keyPressEvent(QKeyEvent * e) { 

    if(e->key() == Qt::Key_Up) 
     this->camPosy += 0.5; 
    if(e->key() == Qt::Key_Down) 
     this->camPosy -= 0.5; 

} 

它顯示我的平方(這應該是我的房間),但它不會將牆壁上的.bmp文件。

+0

'而QImage :: Format_RGB32'是不一樣'GL_RGBA',這不是」沒有alpha通道。 – cmannett85

回答

2

那麼,你必須提供一些紋理座標。 OpenGL並沒有內建的crytall球體,並且可以猜測你想如何放置紋理。


在一個側面說明:在​​所有的代碼(除了紋理加載)和resizeGL被更好地放置在繪圖功能。實際上,在繪圖函數中按需加載紋理也是有意義的,但只有結合適當的幾何圖形剔除和按需幾何加載纔有用。


而且在錯誤信息,請要麼寫

「沒有找到圖像。」(過去時態 '做' 意味着現在時動詞)

「圖像未找到」。(如果沒有使用「你」寫的謂語動詞用過去時態)

但是,這是更好地放置在https://english.stackexchange.com/