2

OpenGL RGBA テクスチャがあり、フレームバッファ オブジェクトを使用して、別の RGBA テクスチャをそれにブリットします。問題は、結果のブリットで通常のブレンド関数を使用する glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), と、デスティネーション テクスチャ アルファが変更され、以前のアルファが 1 だった場所がわずかに透明になることです。 on RGB 値は および とまったく同じである必要がGL_SRC_ALPHAありGL_ONE_MINUS_SRC_ALPHAます。したがって、ブレンド係数関数は (As,As,As,0) および (1-As,1-As,1-As,1) である必要があります。どうすればそれを達成できますか?

4

2 に答える 2

7

RGB とアルファのブレンド モードを異なる方程式に設定できます。

void glBlendFuncSeparate(
    GLenum srcRGB, 
    GLenum dstRGB, 
    GLenum srcAlpha, 
    GLenum dstAlpha);

あなたの場合、次の列挙型を使用したい:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

glBlendFuncSeparate 関数を拡張機能としてインポートする必要がある場合があることに注意してください。そうしても安全です。この機能は非常に長い間使用されています。これは OpenGL 1.4 の一部です

同じことを行う別の方法は、glColorMask を使用してアルファ チャネルへの書き込みを無効にすることです。

void glColorMask( GLboolean red,
                  GLboolean green,
                  GLboolean blue,
                  GLboolean alpha )

OpenGL ドライバーは最も一般的に使用される関数を最適化し、glColorMask はめったに使用されない OpenGL 関数の 1 つであるため、glBlendFuncSeparate よりもはるかに遅くなる可能性があります。

運が悪ければ、変わった関数を呼び出してソフトウェア レンダリング エミュレーションを行うことになるかもしれません :-)

于 2008-09-28T16:03:13.533 に答える
1

glColorMask ()を使用できますか? 4 つのカラー コンポーネントのそれぞれへの書き込みを有効/無効にできます。

于 2008-09-28T16:00:21.807 に答える