0

OpenGL でブレンディングを使用しているときに、(できれば) 小さな問題があります。現在、LWJGL と Slick-Util を使用してテクスチャをロードしています。テクスチャ自体は 2048x2048 の png グラフィックで、128x128 のサイズのタイルを格納して、行/列ごとに 16 個のスプライトを作成します。glTexCoord2f() は正規化された座標を使用するため、必要なスプライトのみを表示するように画像全体をスケーリングする小さな関数を作成しました。次のようになります。

private Rectangle4d getTexCoord(int x, int y) {
    double row = 0, col = 0;
    if(x > 0)
        row = x/16d;
    if(y > 0)
        col = y/16d;

    return new Rectangle4d(row, col, 1d/16d, 1d/16d);
}

(Rectangle4d は、x、y、幅、高さを double 座標として格納するタイプです)

問題は、これらの座標を使用すると、スプライトが正しく表示され、透明度も正しく機能し、他のすべてが大幅に暗くなることです (より正確には透明になると思いますが、ClearColor が黒であるため)。ただし、スプライト自体は正しく描画されます。すべての glColor3d(..) を glColor4d(..) に変更し、アルファを 1d に設定しようとしましたが、何も変わりませんでした。スプライトは現在唯一の画像で、他のすべては色付きの四角形です。

OpenGLを初期化する方法は次のとおりです。

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

そして、これがスプライトをロードする方法です(slick-utilを使用):

texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/sprites.png"));

最後に、次のようにレンダリングします (上部に記載されているヘルパー関数 getTexCoord() を使用):

    texture.bind();
    glColor4d(1, 1, 1, 1);
    glBegin(GL_QUADS);
    {
        Rectangle4d texCoord = getTexCoord(0, 0);
        glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY());
        glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY());
        glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY()+(float)texCoord.getHeight());
        glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY()+(float)texCoord.getHeight());
        glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);
    }
    glEnd();

結果は次のようになります (スプライトは正しく描画され、他のすべてがより暗く/透明になります): テクスチャをクワッドに割り当てた後の外観 テクスチャがないと (灰色のクワッドのみ)、次のようになります (スプライトがないことを除いて、すべてが正しく描画されます)。 クワッドにテクスチャを割り当てない場合の外観

これを読んでくれてありがとう!


編集

問題を見つけようとする私の試みからのいくつかの追加情報: これは、 ClearColor を白に設定したときの外観です ( glClearColor(1, 1, 1, 1) を使用): ClearColor を白に設定する

私が試したもう 1 つのことは、プレーヤーを描画する直前にブレンドを有効にし、描画が終了した直後に再び無効にすることです。 これは、プレーヤーの描画時にブレンドのみを使用しているときに発生します (blackclear)

今は少し良くなりましたが、まだ著しく暗いです。この場合、実際には「より透明」ではなく「より暗い」ように見えます。これは、ここに示すように、白をクリアカラーとして使用する場合と同じであるためです (ただし、必要なときにのみブレンドを有効にし、直後に無効にします)。 これは、プレーヤーを描画するときにブレンディングのみを使用しているときに発生します(ホワイトクリア)

4

1 に答える 1

1

関連する質問をいくつか読み、最終的に解決策を見つけました(Link)。どうやら、テクスチャのないオブジェクト (この場合は色付きの四角形) をレンダリングしたいときは、常に GL_TEXTURE_2D を有効にすることはできません/すべきではありません!

そのため、スプライトをレンダリングする前にのみ有効にし、スプライトが描画されたら再度無効にします。それは今完全に動作します!:)

于 2013-03-18T16:07:05.540 に答える