2

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 ファイルは配置されません。

4

1 に答える 1

2

テクスチャ座標を指定する必要があります。OpenGL には Crystall Orb が組み込まれておらず、テクスチャをどのように配置するかを推測できます。


補足: すべてのコードinitializeGL(テクスチャの読み込みを除く)resizeGLは、描画関数に配置することをお勧めします。実際には、描画関数でオンデマンドでテクスチャをロードすることも理にかなっていますが、適切なジオメトリ カリングとオンデマンド ジオメトリ ロードと組み合わせた場合にのみメリットがあります。


また、エラーメッセージに次のいずれかを書いてください

「画像が見つかりませんでした。」(過去形の 'do' は現在形の動詞を意味します)

また

「画像が見つかりません。」(「do」を使用しない場合は動詞を過去形で書きます)

ただし、これはhttps://english.stackexchange.com/に配置することをお勧めします

于 2012-05-21T14:50:36.580 に答える