2012-05-21 28 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/