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) を使用):
私が試したもう 1 つのことは、プレーヤーを描画する直前にブレンドを有効にし、描画が終了した直後に再び無効にすることです。
今は少し良くなりましたが、まだ著しく暗いです。この場合、実際には「より透明」ではなく「より暗い」ように見えます。これは、ここに示すように、白をクリアカラーとして使用する場合と同じであるためです (ただし、必要なときにのみブレンドを有効にし、直後に無効にします)。