3D メッシュをテクスチャリングするために OpenGL でビットマップを読み込んでいます。これらのビットマップの一部には、一部のピクセルのアルファ チャネル (透明度) があり、最適な方法を見つける必要があります。
- 各ピクセルの透明度の値を取得する
と
- 透明度を適用してレンダリングする
誰かがこれの良い例を持っていますか? OpenGL はこれをサポートしていますか?
3D メッシュをテクスチャリングするために OpenGL でビットマップを読み込んでいます。これらのビットマップの一部には、一部のピクセルのアルファ チャネル (透明度) があり、最適な方法を見つける必要があります。
と
誰かがこれの良い例を持っていますか? OpenGL はこれをサポートしていますか?
まず、各チャネル(R、G、B、A)が8ビットになるように、ビットマップデータを32ビットに変換するのが一般的に最適です。テクスチャをアップロードするときは、32ビット形式を指定してください。
glEnable(GL_BLEND);
次に、レンダリングするときに、ブレンド関数を設定する必要があります。例: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
。これにより、OpenGLは、テクスチャのアルファを使用して、テクスチャのRGBと背景のRGBを混合するように指示されます。
これを3Dオブジェクトに対して行う場合は、背面カリングをオフにして(オブジェクトの背面が前面から見えるようにする)、三角形を背面から前面に並べ替える(ブレンドが行われるようにする)こともできます。正しい順序で)。
ソースビットマップが8ビットの場合(つまり、透明マスクとして1つの色が指定されたパレットを使用する場合)、それをRGBAに変換し、色が透明マスクと一致するときにアルファ値を0に設定するのがおそらく最も簡単です。
物事を(多分)見栄えよくするためのいくつかのヒント:
ピックスマップが 8 ビットの単一チャネルの場合、それらはグレースケールであるか、パレットを使用します。最初に行う必要があるのは、ピックスマップ データを RGBA 形式に変換することです。このために、元のファイルのサイズの 4 チャネル ピックスマップを保持するのに十分な大きさのバッファーを割り当てます。次に、ピックスマップの各ピクセルに対して、そのピクセルの値をパレット (ルックアップ テーブル) へのインデックスとして使用し、その色の値を RGBA バッファー内の対応するピクセルに入れます。完了したら、glTexImage2Dを使用して OpenGL にアップロードします。
GPU がフラグメント シェーダーをサポートしている場合 (おそらく)、シェーダーで LUT 変換を行うことができます: GL_RED または GL_LUMINANCE 2D テクスチャとして 8 ビット pixmal をアップロードします。そして、パレットを 1D GL_RGBA テクスチャとしてアップロードします。次に、フラグメント シェーダーで次のようにします。
uniform sampler2D texture;
uniform sampler1D palette_lut;
void main()
{
float palette_index = texture2D(texture,gl_TexCoord[0].st).r;
vec4 color = texture1D(palette_lut, palette_index);
gl_FragColor = color;
}
ブレンド レンダリングは Z バッファ アルゴリズムと競合するため、適切に表示するには、ジオメトリを前後に並べ替える必要があります。これがオブジェクト全体に影響を与える限り、これはかなり単純ですが、フレームごとにレンダリングするメッシュの面を並べ替える必要がある場合は面倒です。これを回避する方法は、メッシュを凸状のサブメッシュに分割することです (もちろん、既に凸状になっているメッシュをさらに分割することはできません)。次に、次の方法を使用します。