1

フレームごとに背景を描画します:

void Window::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    backgrd->Draw();

    texture = text->loadTexture(text->amis_path.toStdString(),text->w,text->h);
    amis->Draw();

    texture = text->loadTexture(text->enemis_path.toStdString(),text->w,text->h);
    for (int i = 0; i<liste_enemis.length(); i++){
        liste_enemis[i]->Draw();
    }

    for (int i = 0; i<liste_missiles.length(); i++){
        liste_missiles[i]->Draw();
    }
    swapBuffers();
}

しかし、ゲームを実行すると、fps はかなり悪い (1fps) です。

編集 :

背景をテクスチャに一度ロードしようとしていますが、うまくいきません:

Background::Background(int w, int h)
{
    width = w;
    height = h;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D,0, GL_RGBA, back.width(), back.height(), 0,
    GL_RGBA, GL_UNSIGNED_BYTE, back.bits());
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}

void Background::Draw(){
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D,texture);
    glPushMatrix();
    glTranslatef(width/2, height/2, 0.0f);
    glBegin(GL_QUADS);
    glTexCoord2d(0,0); glVertex3f(-width/2, -height/2, 0.0f);
    glTexCoord2d(0,1); glVertex3f(-width/2, height/2, 0.0f);
    glTexCoord2d(1,1); glVertex3f(width/2, height/2, 0.0f);
    glTexCoord2d(1,0); glVertex3d(width/2, -height/2, 0.0f);
    glEnd();
    glPopMatrix();
}

コンストラクターは glTexImage2D(...) で背景を読み込み、それを「テクスチャ」変数にリンクします。次に、paintGL() 関数で、Background::Draw() 関数を呼び出します。

しかし、ゲームを実行すると背景がありません。

glTexParameteri(...) および glTexImage2D(...) 関数をコンストラクターから Draw 関数に移動すると、機能します。

4

1 に答える 1

5

フレームごとにテクスチャをリロードしているので、パフォーマンスが低下します(すぐにメモリを消費します)。

フレームごとにテクスチャをリロードする代わりに、一度だけロードしてから、を使用してテクスチャを切り替えます。glBindTexture

于 2012-06-26T12:43:35.357 に答える