質問

メイン画像を完全に不透明に保ちながら、24ビットビットマップの背景を削除する方法を探しています。これまでブレンドが目的を果たしていましたが、メインビットを不透明に保つ必要があります。 Googleで検索しましたが、何も役に立たなかったので、間違った用語を検索している可能性が高いと思います。

編集: 申し訳ありませんが、今は背景として黒を使用しています。

役に立ちましたか?

解決

OpenGLのテクスチャを作成する場合、32ビットRGBAテクスチャとしてテクスチャを作成する必要があります。この新しい32ビットテクスチャのコンテンツを保持するバッファを作成し、24ビットビットマップを反復処理します。背景色に出会うたびに、新しい32ビットビットマップでアルファをゼロに設定します。

struct Color32;
struct Color24;

void Load24BitTexture(Color24* ipTex24, int width, int height)
{
   Color32* lpTex32 = new Color32[width*height];

   for(x = 0; x < width; x++)
   {
      for(y = 0; y < height; y++)
      {
         int index = y*width+x;
         lpTex32[index].r = ipTex24[index].r;
         lpTex32[index].g = ipTex24[index].g;
         lpTex32[index].b = ipTex24[index].b;

         if( ipTex24[index] == BackgroundColor)
            lpTex32[index].a = 0;
         else
            lpTex32[index].a = 255;
      }
   }

   glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpTex32);

   delete [] lpTex32;
}

他のヒント

glTexImage2Dの呼び出しで、GL_RGBA形式のテクスチャをロードする必要があります。 これを行った場合、ブレンドを有効にする必要があります:

    /* Set up blend */
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

これは少しわかりにくいかもしれません。 24ビット画像には透明度はありません。単純にRGB値の配列です。メインビットを不透明に保つこととはどういう意味ですか?すべてのピクセルを特定の色にしたいですか&#8211;たとえば、すべての黒ピクセル&#8211;トランスペアレント?これが必要な場合は、Google opengl透明マスク NeHe#20 などを参照してください。

>

本当に必要なのは、画像内のアルファチャネルです。 24ビットなので、1つはありませんが、黒(0x000000)ピクセルごとにアルファをゼロに設定するだけで、画像を読み込むときにオンザフライで作成できます

ステンシルバッファーを探しているように聞こえますが、これは描画領域を制限するこの種のタスクにのみ使用されます。

バッファには、各ピクセルに関連付けられた値が格納されます。1つの後続の描画がレンダリングされ、0がマスクされます。通常、ステンシルバッファーは、反射やヘッドアップディスプレイなどを作成するために、マルチパスレンダリング手法で使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top