3

私はopenGLで少し遊んでいて、どうすれば画像(たとえば黒の背景)を撮ってから、上部に小さな白いグラデーションをレンダリングして、白いグラデーションを透明にすることができるのか疑問に思いました(代わりに白)と黒の背景から削除します。中央に透明なグラデーションのある黒い背景を残します。それが助けになるなら、私はLWJGLを使用しています。

ブレンディングでこれを行う方法はありますか?

編集:さて、2つの画像を引く代わりに、画像の周りに黒を描く方法はありますか?だから私は私の白いグラデーションを持っています、それを透明に変えて、それからその周りに黒を描きますか?

4

2 に答える 2

2

固定機能は通常、最新のGLドライバーのシェーダーを使用して実装されます(すべての固定機能にSM2.0 +シェーダーを使用した古いATIのプレゼンテーションがあります)。

このような自明に近いブレンディングフラグメントシェーダー

in vec2 TexCoord;

uniform sampler2D Texture0;
uniform sampler2D Texture1;

out vec4 out_FragColor;

void main()
{
     vec4 Color = texture(Texture0, TexCoord);

     /// The mask contains (R,G,B,A) - image + transparency
     /// for both the mask and the source
     vec4 Mask  = texture(Texture1, TexCoord);

     /// Mask is also significant as a color source, not only the alpha
     out_FragColor = Color * ( 1.0 - Mask.a ) + Mask * Mask.a;

     /// Thanks to Tim's comment, the last line can be done simpler:
     /* out_FragColor = mix(Color, Mask, Mask.a); */
}

あなたが望むように画像を混ぜる必要があります。

これは最新のハードウェアにとってはやり過ぎではなく、GL ES 2.0ハードウェアと100%互換性があります。

編集:

私のプロジェクトの1つからの画像(フェードアウェイ反射を作成するために使用される単純なマスク)。

このマスクを使用します

シェードマスク

この画像で最終結果を取得します:ギャラリー

于 2012-06-26T20:27:41.273 に答える
0

特定のケースでは目的を達成できる可能性がありますが、一般に、「黒い背景を描画」すると、後でそれを透明にする方法はありません。すでに描画されているピクセルを削除または消去することはできません。

黒の背景の前にグラデーションを描画できる場合は、アルファをフレームバッファーに配置し、後で黒の背景を描画するときに宛先のアルファをサンプリングできます。ただし、描画時に白のグラデーションをアルファグラデーションに実際に変換することはできないため、実際のアルファテクスチャが必要になります。

これが私の提案した擬似コードです:

  1. バックグラウンドで好きなものを描く
  2. アルファグラデーションでテクスチャを作成する
  3. カラーチャンネルをロックするglColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
  4. 背景の上にアルファグラデーションを描く
  5. でカラーチャンネルのマスクを解除しますglColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
  6. 次のブレンドオプションを使用して「黒のテクスチャ」を描画します。glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)

これにより、下にあるものすべてにグラデーションがブレンドされた黒いテクスチャが残ります。

于 2012-06-30T20:33:35.460 に答える