0

次の方法で2つの画像をブレンドしようとしています:

イメージ 1 はベース イメージとして描画する必要があります。画像 2 は、画像 1 の上に描画する必要があります。画像 2 が透明でない場合は、画像 1 の内容を置き換える必要があります (ブレンドではなく、そこにあるものを上書きします)。画像 2 が透明なところはどこでも、画像 1 が透けて見えるはずです。次のコードでこれを実行しようとしましたが、明らかにブレンディングで何か間違ったことをしています。

            gl.glEnable(GL.GL_BLEND);
            if (iconTexture1 != null)
            {
                gl.glEnable(GL.GL_TEXTURE_2D);
                iconTexture1.bind();
                double red = (double) fillColor.getRed() / 255.0;
                double green = (double) fillColor.getGreen() / 255.0;
                double blue = (double) fillColor.getBlue() / 255.0;
                gl.glColor4d(red, green, blue, this.getOpacity());
                gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
                TextureCoords texCoords = iconTexture1.getImageTexCoords();
                gl.glScaled(width, height, 1d);
                dc.drawUnitQuad(texCoords);
            }
            if (iconTexture2 != null)
            {
                gl.glEnable(GL.GL_TEXTURE_2D);
                iconTexture2.bind();
                // image2 is all white, so color it here
                gl.glColor4d(1d, 0d, 0d, 1d);

                // TODO: What blend function should I be using here to allow image 2 to overwrite what is already there?

                TextureCoords texCoords = iconTexture2.getImageTexCoords();
                gl.glScaled(width, height, 1d);
                dc.drawUnitQuad(texCoords);
            }

これを正しく機能させるための助けをいただければ幸いです。ありがとう。

ジェフ

4

1 に答える 1

2

問題になる可能性のあることがいくつかあります。

  1. イメージ1を描画するまで、ブレンド機能をオンにしないでください。オンにすると、イメージ1がすでに存在するものとブレンドされます。
  2. 私は大きなテクスチャユーザーではありませんが、テクスチャを使用すると、指定したアルファを含め、クワッドの色が上書きされると思います。したがって、テクスチャにアルファがない限り、ブレンドは行われません。
  3. Zバッファリングを有効にしている場合は、画像2が画像1の後ろにある可能性があります。画像2が透明であっても、それはそれを覆い隠します。透明な3Dを描画するには、特別な方法を使用する必要があります。

うまくいかないように見えるOpenGLを操作する良い方法は、すべての複雑さを取り除き、それを少しずつ追加することです。テクスチャはあなたの最も複雑な部分です-最後までそれを残してください。

于 2010-09-07T16:51:26.020 に答える