0

Android 2.2 以降で OpenGL を使用した 2D グラフィックス プログラムを開発しています。

通常、半透明のテクスチャーを重ねると左の画像のようになります。最初にテクスチャを重ねて、右の画像のように透明にしたいと思います。キャンバスで画像を積み上げてテクスチャにする方法は効率が悪いです。OpenGL API を使用する方法はありますか?

ここに画像の説明を入力

4

1 に答える 1

0

これは単なる考えですが、試してみる価値はあります。最初にブレンドせずに前景要素を描画してから、「glBlendFuncSeparate」を使用して背景を描画できる場合があります。前景部分は説明どおりに要素を描画する必要があり、ブレンド機能では、背景とブレンドするために必要な透明度を制御できます。悪いニュースは、背景に描画する要素がさらにある場合です。

一般に、前景要素を描画するには、テクスチャがバインドされたフレーム バッファ オブジェクトを使用する必要があります。次に、バインドされたテクスチャをシーンで使用します。

(Android でこの関数を置き換える方法を見つける必要があります)

    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resolution, resolution, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

これにより、メイン シーンに関して何でも描画できるキャンバスが作成され、バインドされたテクスチャを再利用できます。「解像度」はおそらく2の累乗である必要があることに注意してください。また、描画する前にマトリックスとビューポートを設定する必要があります。

于 2012-12-04T08:25:48.703 に答える