-2

1グローバルでアルファテストを行うことはできますか?

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_EQUAL, 0.7);

これらの2つの関数を使用して、テクスチャを描画し、alpha>=0.7の画像を表示できます。私の質問は、2つのテクスチャを描画する場合、それらの一部が重なり、アルファの合計が0.7になる場合、この部分をどのように表示するかです。


2ビットマップをより効率的に描画する方法

質問1について、OpenGLでいくつかの機能を試しましたが、達成できませんでした。だから私は別の方法を試します。を設定しmap[512][512]ます。まず、このマップにすべてのテクスチャを描画し、自分でアルファを蓄積します。ピクセルアルファ>=0.7の場合は色を設定し、そうでない場合は白色を設定します。最後に、マップ全体をテクスチャとしてウィンドウに描画します。この方法を使用して、グローバルでアルファテストを実行できます。しかし、それは非常に遅いです。

(このメソッドは、stackoverflowのBartek Banachewiczからのものです)

これが私の関数です:

  1. map[512][512]すべてゼロに設定された初期化

  2. このマップにすべてのものを描き、アルファを蓄積します

  3. マップですべてのピクセルをループし、アルファに従って色を設定します

  4. テクスチャを生成するために使用glTexImage2D()する(これは遅いかもしれないと思います)

  5. を使用glTexCoord2fglVertex3fて、これをウィンドウに描画します。

この方法を使って、私は約100の物を描きます、それは本当に遅くなります(約20 FPS)

この方法を最適化するために何かをしたり、別の成果を上げたりできますか?

4

1 に答える 1

2

私の質問は、2つのテクスチャを描画する場合、それらの一部が重なり、アルファの合計が0.7になる場合、この部分をどのように表示するかです。

まず、いくつかの用語:

テクスチャを描画することはできません。三角形のみを描画できます。これには、1つまたは複数のテクスチャを三角形にマッピングする必要がある場合があります。

両方のテクスチャを三角形にマッピングしている場合、それらのアルファで何をするかは、シェーダー(または、シェーダーを使用していない場合はglTexEnv設定)によって異なります。それらを別々に描画している場合は、2つのテクスチャを描画していません。1つのテクスチャを描画し、次に別のテクスチャを描画します。

ブレンドモードを使用しない限り、最初のテクスチャが描画したものが2番目のテクスチャに影響を与えることはありません。または3番目。

ビットマップをより効率的に描画する方法

一般的に、あなたはしません。画像データの転送をより効率的にする方法はありますが(非同期転送およびバッファストリーミング技術のピクセルバッファオブジェクトを中心に)、画像をブリットするだけの場合、これを行う正しい方法は、フレームごとにテクスチャを作成しないことです。 。

あなたがしたいのは、OpenGLにこれまでに使用する予定のすべての画像を与え、次にテクスチャマッピングされた三角形(クワッド)を使用してそれらを画面に直接描画することです。これは、2Dブリッティングを行うほとんどのアプリケーションで行われる方法です。

于 2012-08-29T12:01:51.033 に答える