メイン画像を完全に不透明に保ちながら、24ビットビットマップの背景を削除する方法を探しています。これまではブレンドが目的を果たしていましたが、メインビットを不透明に保つ必要があります。私はグーグルで検索しましたが、役に立たなかったのですが、おそらく間違った用語を検索していると思いますので、助けていただければ幸いです。
編集:はい、申し訳ありませんが、現在、背景として黒を使用しています。
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値の配列です。「メインビットを不透明に保つ」とはどういう意味ですか?特定の色のすべてのピクセル(たとえば、すべての黒のピクセル)を透明にしますか?これが必要な場合は、opengl透明マスクをグーグルで検索できます(たとえば、NeHe#20を参照)。
本当に必要なのは、画像のアルファチャネルです。24ビットなので、1つはありませんが、黒(0x000000)ピクセルごとにアルファをゼロに設定するだけで、画像をロードするときにオンザフライで作成できます。
描画領域を制限するこの種のタスクに使用されるステンシルバッファを探しているように思えます。
バッファには、各ピクセルに関連付けられた値が格納されます。後続の1つの描画がレンダリングされ、0の場合はマスクされます。通常、ステンシルバッファは、反射やヘッドアップディスプレイなどを作成するために、マルチパスレンダリング手法で使用されます。