1

3D メッシュをテクスチャリングするために OpenGL でビットマップを読み込んでいます。これらのビットマップの一部には、一部のピクセルのアルファ チャネル (透明度) があり、最適な方法を見つける必要があります。

  1. 各ピクセルの透明度の値を取得する

  1. 透明度を適用してレンダリングする

誰かがこれの良い例を持っていますか? OpenGL はこれをサポートしていますか?

4

2 に答える 2

5

まず、各チャネル(R、G、B、A)が8ビットになるように、ビットマップデータを32ビットに変換するのが一般的に最適です。テクスチャをアップロードするときは、32ビット形式を指定してください。

glEnable(GL_BLEND);次に、レンダリングするときに、ブレンド関数を設定する必要があります。例: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);。これにより、OpenGLは、テクスチャのアルファを使用して、テクスチャのRGBと背景のRG​​Bを混合するように指示されます。

これを3Dオブジェクトに対して行う場合は、背面カリングをオフにして(オブジェクトの背面が前面から見えるようにする)、三角形を背面から前面に並べ替える(ブレンドが行われるようにする)こともできます。正しい順序で)。

ソースビットマップが8ビットの場合(つまり、透明マスクとして1つの色が指定されたパレットを使用する場合)、それをRGBAに変換し、色が透明マスクと一致するときにアルファ値を0に設定するのがおそらく最も簡単です。

物事を(多分)見栄えよくするためのいくつかのヒント:

  • アルファチャネルはオールオアナッシング(0x00または0xff)になるため、ぼかしアルゴリズムを適用して、エッジを柔らかくします。
  • アルファがゼロ(完全に透明)のテクセル(テクスチャピクセル)の場合、RGBカラーを最も近い不透明なテクセルに置き換えます。テクスチャ座標が補間されているとき、それらはBMPからの元の透明色にブレンドされません。
于 2011-06-20T05:09:06.357 に答える
1

ピックスマップが 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 バッファ アルゴリズムと競合するため、適切に表示するには、ジオメトリを前後に並べ替える必要があります。これがオブジェクト全体に影響を与える限り、これはかなり単純ですが、フレームごとにレンダリングするメッシュの面を並べ替える必要がある場合は面倒です。これを回避する方法は、メッシュを凸状のサブメッシュに分割することです (もちろん、既に凸状になっているメッシュをさらに分割することはできません)。次に、次の方法を使用します。

  • 顔カリングを有効にする
  • 並べ替えられた(メッシュ、遠くから近くまで)のconvex_submeshの場合:
    • 顔カリングを前面に設定します (つまり、背面がレンダリングされます)。
    • 凸サブメッシュをレンダリングする
    • 面カリングを背面に設定します (つまり、前面がレンダリングされます)。
    • 再びconvex_submeshをレンダリング
于 2011-06-20T07:30:10.287 に答える