1

これは私がやっていることです:

  • 次の色を使用して最初の画像をレンダリングします。glColor4f(1.0, 1.0, 1.0, 1.0);
  • 次の色を使用して、2 番目のイメージをレンダリングしますglColor4f(1.0, 1.0, 1.0, calc);calcは 1 秒以内に 0.0 から 1.0 に変化する数値であり、実際にこれが行われることを確認できます。

私が期待しているのは、ある画像から別の画像にフェードすることであり、これを行いますが、途中で、ある種の灰色の色合いになります (黒は背景色です)。問題はhttp://www.youtube.com/watch?v=8dZXiYIM43s&feature=youtu.beで確認できます。

フェードの途中で灰色がかったトーンなしで、基本的なフェードが欲しいだけです(不透明度0.5で最も強い)。私はGIMPでこれをやってみました.一番下のレイヤーは不透明で、一番上のレイヤーは不透明度が可変です.それはうまく動作します.それは私がやりたいことを正確に行います.なぜ私のコード(またはOpenGL)がうまくいかないのかわかりません同じことをしないでください。私が何を意味するかを示すビデオ: http://www.youtube.com/watch?v=Ym-VPu9hhjQ&feature=youtu.be

EDIT : 少し実験 (背景色を赤に変更) した後、0.5 で半透明になります。これは通常必要な効果ですが、両方のテクスチャが半透明です (上部のテクスチャだけではありません)。なぜこれが起こるのですか??

コードは次のとおりです。

void Sprite::render_single(Image* image, Pos2D pos, Angle angle) {
        int cx = image->width / 2;
        int cy = image->height / 2;
        glPushMatrix();
        glTranslatef(pos.x + cx, pos.y + cy, 0);
        glRotatef(angle.to_degrees(), 0.0, 0.0, 1.0);
        glTranslatef(-cx, -cy, 0);
        image->bind();
        glBegin(GL_QUADS);
                glTexCoord2f(0.0, 0.0);
                glVertex2f(0.0, 0.0);
                glTexCoord2f(1.0, 0.0);
                glVertex2f(image->width, 0.0);
                glTexCoord2f(1.0, 1.0);
                glVertex2f(image->width, image->height);
                glTexCoord2f(0.0, 1.0);
                glVertex2f(0.0, image->height);
        glEnd();
        image->unbind();
        glPopMatrix();
}

void Sprite::render(Pos2D pos, Angle angle) {
        Image* img = this->get_current_frame();
        if (this->images.size() == 1) {
                this->render_single(img, pos, angle);
                return;
        }
        double calc = (((double)this->current_frame_overflow) / this->frame_length);
        std::cout << calc << std::endl;
        glPushMatrix();
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        this->render_single(img, pos, angle);
        img = this->get_next_frame();
        glColor4f(1.0f, 1.0f, 1.0f, calc);
        this->render_single(img, pos, angle);
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        glPopMatrix();
}

使用されるブレンド関数:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

OpenGL 初期化関数:

/**
 * @brief Initializes OpenGL
 */
void Game::init_gl() {
        float width = this->display->w;
        float height = this->display->h;
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, width, height, 0.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glDisable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

また、メイン ループのソース コード全体 (OpenGL のほとんどを含む) は次のとおりです: https://github.com/MiJyn/dbab/blob/master/src/game.cpp。そしてスプライト: https://github.com/MiJyn/dbab/blob/master/src/sprite.cpp .

4

2 に答える 2